11# General imports
2- import os
2+ import glob
3+ from os .path import basename , expanduser , isdir
34
4- import pandas as pd
55import numpy as np
6+ import pandas as pd
67
78# ETS imports
8- from traits .api import Directory , Event , HasStrictTraits , Instance
9+ from traits .api import (
10+ Directory , Event , HasStrictTraits , Instance , List , observe ,
11+ )
912
1013# Local imports
11- from .image_file import ImageFile , SUPPORTED_FORMATS
14+ from pycasa . model .image_file import ImageFile , SUPPORTED_FORMATS
1215
1316FILENAME_COL = "filename"
14-
1517NUM_FACE_COL = "Num. faces"
1618
1719
1820class ImageFolder (HasStrictTraits ):
19- """ Model to hold an image folder .
21+ """ Model for a folder of images .
2022 """
21- path = Directory
23+ directory = Directory (expanduser ("~" ))
24+
25+ images = List (Instance (ImageFile ))
2226
2327 data = Instance (pd .DataFrame )
2428
@@ -27,39 +31,39 @@ class ImageFolder(HasStrictTraits):
2731 def __init__ (self , ** traits ):
2832 # Don't forget this!
2933 super (ImageFolder , self ).__init__ (** traits )
30- if not os . path . isdir (self .path ):
31- msg = f"Unable to create an ImageFolder from { self . path } since " \
32- f" it is not a valid directory. "
34+ if not isdir (self .directory ):
35+ msg = f"The provided directory isn't a real directory: " \
36+ f"{ self . directory } "
3337 raise ValueError (msg )
38+ self .data = self ._create_metadata_df ()
3439
35- self .data = self .to_dataframe ()
40+ @observe ("directory" )
41+ def _update_images (self , event ):
42+ self .images = [
43+ ImageFile (filepath = file )
44+ for fmt in SUPPORTED_FORMATS
45+ for file in glob .glob (f"{ self .directory } /*{ fmt } " )
46+ ]
3647
37- def to_dataframe ( self ):
38- if not self . path :
39- return pd . DataFrame ({ FILENAME_COL : [], NUM_FACE_COL : []} )
48+ @ observe ( "images.items" )
49+ def _update_metadata ( self , event ) :
50+ self . data = self . _create_metadata_df ( )
4051
41- data = []
42- for filename in os .listdir (self .path ):
43- file_ext = os .path .splitext (filename )[1 ].lower ()
44- if file_ext in SUPPORTED_FORMATS :
45- filepath = os .path .join (self .path , filename )
46- img_file = ImageFile (filepath = filepath )
47- file_data = {FILENAME_COL : filename , NUM_FACE_COL : np .nan }
48- try :
49- file_data .update (img_file .metadata )
50- except Exception :
51- pass
52- data .append (file_data )
52+ def _create_metadata_df (self ):
53+ if not self .images :
54+ return pd .DataFrame ({FILENAME_COL : [], NUM_FACE_COL : []})
55+ return pd .DataFrame ([
56+ {
57+ FILENAME_COL : basename (img .filepath ),
58+ NUM_FACE_COL : np .nan ,
59+ ** img .metadata
5360
54- return pd .DataFrame (data )
61+ }
62+ for img in self .images
63+ ])
5564
5665 def compute_num_faces (self , ** kwargs ):
57- cols = list (self .data .columns )
58- for i , filename in enumerate (self .data [FILENAME_COL ]):
59- print (filename )
60- filepath = os .path .join (self .path , filename )
61- img_file = ImageFile (filepath = filepath )
62- faces = img_file .detect_faces (** kwargs )
63- j = cols .index (NUM_FACE_COL )
64- self .data .iloc [i , j ] = len (faces )
66+ for i , image in enumerate (self .images ):
67+ faces = image .detect_faces (** kwargs )
68+ self .data [NUM_FACE_COL ].iat [i ] = len (faces )
6569 self .data_updated = True
0 commit comments