Skip to content

Commit 7b2e3bf

Browse files
committed
Reorganize folders to support slides
- Remove stage3.0 as it's no longer needed - Add the image folder back to stages 2 and 3
1 parent 540794e commit 7b2e3bf

File tree

7 files changed

+175
-134
lines changed

7 files changed

+175
-134
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
2+
# General imports
3+
import glob
4+
from os.path import basename, expanduser, isdir
5+
6+
import numpy as np
7+
import pandas as pd
8+
9+
# ETS imports
10+
from traits.api import (
11+
Directory, HasStrictTraits, Instance, List, observe,
12+
)
13+
14+
# Local imports
15+
from pycasa.model.image_file import ImageFile, SUPPORTED_FORMATS
16+
17+
FILENAME_COL = "filename"
18+
NUM_FACE_COL = "Num. faces"
19+
20+
21+
class ImageFolder(HasStrictTraits):
22+
""" Model for a folder of images.
23+
"""
24+
directory = Directory(expanduser("~"))
25+
26+
images = List(Instance(ImageFile))
27+
28+
data = Instance(pd.DataFrame)
29+
30+
def __init__(self, **traits):
31+
# Don't forget this!
32+
super(ImageFolder, self).__init__(**traits)
33+
if not isdir(self.directory):
34+
msg = f"The provided directory isn't a real directory: " \
35+
f"{self.directory}"
36+
raise ValueError(msg)
37+
self.data = self._create_metadata_df()
38+
39+
@observe("directory")
40+
def _update_images(self, event):
41+
self.images = [
42+
ImageFile(filepath=file)
43+
for fmt in SUPPORTED_FORMATS
44+
for file in glob.glob(f"{self.directory}/*{fmt}")
45+
]
46+
47+
@observe("images.items")
48+
def _update_metadata(self, event):
49+
self.data = self._create_metadata_df()
50+
51+
def _create_metadata_df(self):
52+
if not self.images:
53+
return pd.DataFrame({FILENAME_COL: [], NUM_FACE_COL: []})
54+
return pd.DataFrame([
55+
{
56+
FILENAME_COL: basename(img.filepath),
57+
NUM_FACE_COL: np.nan,
58+
**img.metadata
59+
60+
}
61+
for img in self.images
62+
])

stage3.0_first_views/README.md

Lines changed: 0 additions & 4 deletions
This file was deleted.

stage3.0_first_views/__init__.py

Whitespace-only changes.

stage3.0_first_views/test_traited_face_detect.py

Lines changed: 0 additions & 35 deletions
This file was deleted.

stage3.0_first_views/traited_face_detect.py

Lines changed: 0 additions & 95 deletions
This file was deleted.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
2+
# General imports
3+
import glob
4+
from os.path import basename, expanduser, isdir
5+
6+
import numpy as np
7+
import pandas as pd
8+
9+
# ETS imports
10+
from traits.api import (
11+
Directory, HasStrictTraits, Instance, List, observe,
12+
)
13+
14+
# Local imports
15+
from pycasa.model.image_file import ImageFile, SUPPORTED_FORMATS
16+
17+
FILENAME_COL = "filename"
18+
NUM_FACE_COL = "Num. faces"
19+
20+
21+
class ImageFolder(HasStrictTraits):
22+
""" Model for a folder of images.
23+
"""
24+
directory = Directory(expanduser("~"))
25+
26+
images = List(Instance(ImageFile))
27+
28+
data = Instance(pd.DataFrame)
29+
30+
def __init__(self, **traits):
31+
# Don't forget this!
32+
super(ImageFolder, self).__init__(**traits)
33+
if not isdir(self.directory):
34+
msg = f"The provided directory isn't a real directory: " \
35+
f"{self.directory}"
36+
raise ValueError(msg)
37+
self.data = self._create_metadata_df()
38+
39+
@observe("directory")
40+
def _update_images(self, event):
41+
self.images = [
42+
ImageFile(filepath=file)
43+
for fmt in SUPPORTED_FORMATS
44+
for file in glob.glob(f"{self.directory}/*{fmt}")
45+
]
46+
47+
@observe("images.items")
48+
def _update_metadata(self, event):
49+
self.data = self._create_metadata_df()
50+
51+
def _create_metadata_df(self):
52+
if not self.images:
53+
return pd.DataFrame({FILENAME_COL: [], NUM_FACE_COL: []})
54+
return pd.DataFrame([
55+
{
56+
FILENAME_COL: basename(img.filepath),
57+
NUM_FACE_COL: np.nan,
58+
**img.metadata
59+
60+
}
61+
for img in self.images
62+
])
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from traits.api import Instance
2+
from traitsui.api import (
3+
HGroup, Item, Label, ModelView, Spring, View
4+
)
5+
from traitsui.ui_editors.data_frame_editor import DataFrameEditor
6+
7+
# Local imports
8+
from pycasa.model.image_folder import FILENAME_COL, ImageFolder, NUM_FACE_COL
9+
10+
11+
DISPLAYED_COLUMNS = [FILENAME_COL, NUM_FACE_COL] + [
12+
'ApertureValue', 'ExifVersion', 'Model', 'Make', 'LensModel', 'DateTime',
13+
'ShutterSpeedValue', 'ExposureTime', 'XResolution', 'YResolution',
14+
'Orientation', 'GPSInfo', 'DigitalZoomRatio', 'FocalLengthIn35mmFilm',
15+
'ISOSpeedRatings', 'SceneType'
16+
]
17+
18+
19+
class ImageFolderView(ModelView):
20+
""" ModelView for a folder of images.
21+
"""
22+
model = Instance(ImageFolder)
23+
24+
view = View(
25+
Item('model.directory', style="readonly", show_label=False),
26+
Item(
27+
'model.data',
28+
editor=DataFrameEditor(columns=DISPLAYED_COLUMNS),
29+
show_label=False,
30+
visible_when="len(model.data) > 0",
31+
),
32+
HGroup(
33+
Spring(),
34+
Label("No images found. No data to show"),
35+
Spring(),
36+
visible_when="len(model.data) == 0",
37+
),
38+
resizable=True
39+
)
40+
41+
42+
if __name__ == '__main__':
43+
from os.path import dirname, join
44+
import ets_tutorial
45+
46+
TUTORIAL_DIR = dirname(ets_tutorial.__file__)
47+
SAMPLE_IMG_DIR = join(TUTORIAL_DIR, "..", "sample_images")
48+
49+
image_file = ImageFolder(directory=SAMPLE_IMG_DIR)
50+
view = ImageFolderView(model=image_file)
51+
view.configure_traits()

0 commit comments

Comments
 (0)