summaryrefslogtreecommitdiff
path: root/megapixels
diff options
context:
space:
mode:
Diffstat (limited to 'megapixels')
-rw-r--r--megapixels/app/models/data_store.py2
-rw-r--r--megapixels/app/models/dataset.py18
-rw-r--r--megapixels/app/settings/types.py3
-rw-r--r--megapixels/commands/cv/face_landmarks_3d.py (renamed from megapixels/commands/cv/faces_to_3dlm.py)4
-rw-r--r--megapixels/commands/cv/face_pose.py2
-rw-r--r--megapixels/commands/cv/face_vector.py2
-rw-r--r--megapixels/commands/datasets/lookup.py4
-rw-r--r--megapixels/commands/datasets/s3_sync.py6
-rw-r--r--megapixels/commands/demo/face_search.py26
9 files changed, 41 insertions, 26 deletions
diff --git a/megapixels/app/models/data_store.py b/megapixels/app/models/data_store.py
index 244aba60..7b6bef21 100644
--- a/megapixels/app/models/data_store.py
+++ b/megapixels/app/models/data_store.py
@@ -21,7 +21,7 @@ class DataStore:
def metadata(self, enum_type):
return join(self.dir_metadata, f'{enum_type.name.lower()}.csv')
- def metadata(self, enum_type):
+ def metadata_dir(self):
return join(self.dir_metadata)
def media_images_original(self):
diff --git a/megapixels/app/models/dataset.py b/megapixels/app/models/dataset.py
index 35e10465..eb0109a7 100644
--- a/megapixels/app/models/dataset.py
+++ b/megapixels/app/models/dataset.py
@@ -40,7 +40,7 @@ class Dataset:
self._metadata[metadata_type] = pd.read_csv(fp_csv).set_index('index')
# convert DataFrame to list of floats
self._face_vectors = self.df_vecs_to_dict(self._metadata[metadata_type])
- self._face_vector_idxs = self.df_vec_idxs_to_dict(self._metadata[metadata_type])
+ self._face_vector_roi_idxs = self.df_vec_roi_idxs_to_dict(self._metadata[metadata_type])
self.log.info(f'build face vector dict: {len(self._face_vectors)}')
# remove the face vector column, it can be several GB of memory
self._metadata[metadata_type].drop('vec', axis=1, inplace=True)
@@ -81,8 +81,8 @@ class Dataset:
# future datasets can have multiple identities per images
ds_identities = df_identity.iloc[identity_index]
# get filepath and S3 url
- fp_im = self.data_store.face_image(ds_record.subdir, ds_record.fn, ds_record.ext)
- s3_url = self.data_store_s3.face_image(ds_record.uuid)
+ fp_im = self.data_store.face(ds_record.subdir, ds_record.fn, ds_record.ext)
+ s3_url = self.data_store_s3.face(ds_record.uuid)
image_record = ImageRecord(ds_record, fp_im, s3_url, ds_identities=ds_identities)
return image_record
@@ -147,8 +147,14 @@ class Dataset:
for match_idx in match_idxs:
# get the corresponding face vector row
roi_index = self._face_vector_roi_idxs[match_idx]
+ df_record = self._metadata[types.Metadata.FILE_RECORD]
+ ds_record = df_record.iloc[roi_index]
self.log.debug(f'find match index: {match_idx}, --> roi_index: {roi_index}')
- image_record = self.roi_idx_to_record(roi_index)
+ fp_im = self.data_store.face(ds_record.subdir, ds_record.fn, ds_record.ext)
+ s3_url = self.data_store_s3.face(ds_record.uuid)
+ image_record = ImageRecord(ds_record, fp_im, s3_url)
+ #roi_index = self._face_vector_roi_idxs[match_idx]
+ #image_record = self.roi_idx_to_record(roi_index)
image_records.append(image_record)
return image_records
@@ -159,10 +165,10 @@ class Dataset:
# convert the DataFrame CSV to float list of vecs
return [list(map(float,x.vec.split(','))) for x in df.itertuples()]
- def df_vec_idxs_to_dict(self, df):
+ def df_vec_roi_idxs_to_dict(self, df):
# convert the DataFrame CSV to float list of vecs
#return [x.roi_index for x in df.itertuples()]
- return [x.image_index for x in df.itertuples()]
+ return [x.roi_index for x in df.itertuples()]
def similar(self, query_vec, n_results):
'''Finds most similar N indices of query face vector
diff --git a/megapixels/app/settings/types.py b/megapixels/app/settings/types.py
index 754be618..ee6f8de5 100644
--- a/megapixels/app/settings/types.py
+++ b/megapixels/app/settings/types.py
@@ -45,7 +45,8 @@ class LogLevel(Enum):
# --------------------------------------------------------------------
class Metadata(Enum):
- IDENTITY, FILE_RECORD, FACE_VECTOR, FACE_POSE, FACE_ROI = range(5)
+ IDENTITY, FILE_RECORD, FACE_VECTOR, FACE_POSE, FACE_ROI, FACE_LANDMARKS_68, \
+ FACE_LANDMARKS_3D = range(7)
class Dataset(Enum):
LFW, VGG_FACE2 = range(2)
diff --git a/megapixels/commands/cv/faces_to_3dlm.py b/megapixels/commands/cv/face_landmarks_3d.py
index 658d4484..03ef8fc2 100644
--- a/megapixels/commands/cv/faces_to_3dlm.py
+++ b/megapixels/commands/cv/face_landmarks_3d.py
@@ -1,9 +1,8 @@
"""
-Crop images to prepare for training
+
"""
import click
-# from PIL import Image, ImageOps, ImageFilter, ImageDraw
from app.settings import types
from app.utils import click_utils
@@ -55,6 +54,7 @@ def cli(ctx, opt_dirs_in, opt_fp_out, opt_ext, opt_size, opt_gpu, opt_slice,
# -------------------------------------------------
# init here
+
log = logger_utils.Logger.getLogger()
if not opt_force and Path(opt_fp_out).exists():
diff --git a/megapixels/commands/cv/face_pose.py b/megapixels/commands/cv/face_pose.py
index e7ffb7ac..c37d006f 100644
--- a/megapixels/commands/cv/face_pose.py
+++ b/megapixels/commands/cv/face_pose.py
@@ -95,7 +95,7 @@ def cli(ctx, opt_fp_in, opt_fp_out, opt_dir_media, opt_data_store, opt_dataset,
for record_index, df_img_group in tqdm(df_img_groups):
# make fp
ds_record = df_record.iloc[record_index]
- fp_im = data_store.face_image(ds_record.subdir, ds_record.fn, ds_record.ext)
+ fp_im = data_store.face(ds_record.subdir, ds_record.fn, ds_record.ext)
im = cv.imread(fp_im)
# get bbox
x = df_img_group.x.values[0]
diff --git a/megapixels/commands/cv/face_vector.py b/megapixels/commands/cv/face_vector.py
index 203f73eb..cd816f9f 100644
--- a/megapixels/commands/cv/face_vector.py
+++ b/megapixels/commands/cv/face_vector.py
@@ -98,7 +98,7 @@ def cli(ctx, opt_fp_out, opt_dir_media, opt_data_store, opt_dataset, opt_size,
ds_file = df_record.loc[roi_index] # locate image meta
#ds_file = df_record.loc['index', image_index] # locate image meta
- fp_im = data_store.face_image(str(ds_file.subdir), str(ds_file.fn), str(ds_file.ext))
+ fp_im = data_store.face(str(ds_file.subdir), str(ds_file.fn), str(ds_file.ext))
im = cv.imread(fp_im)
# get bbox
x = df_img_group.x.values[0]
diff --git a/megapixels/commands/datasets/lookup.py b/megapixels/commands/datasets/lookup.py
index c1c66c19..5ae4c3f5 100644
--- a/megapixels/commands/datasets/lookup.py
+++ b/megapixels/commands/datasets/lookup.py
@@ -10,7 +10,7 @@ log = Logger.getLogger()
@click.command()
@click.option('--index', 'opt_index', type=int, required=True,
- help='Vector index to lookup')
+ help='File index to lookup')
@click.option('--data_store', 'opt_data_store',
type=cfg.DataStoreVar,
default=click_utils.get_default(types.DataStore.SSD),
@@ -45,7 +45,7 @@ def cli(ctx, opt_index, opt_data_store, opt_dataset):
dataset.load_records()
dataset.load_identities()
# set data store and load files
- # find image records
+ # get image record from file index
image_record = dataset.index_to_record(opt_index)
image_record.summarize()
# load image
diff --git a/megapixels/commands/datasets/s3_sync.py b/megapixels/commands/datasets/s3_sync.py
index 3098d9be..17940c6d 100644
--- a/megapixels/commands/datasets/s3_sync.py
+++ b/megapixels/commands/datasets/s3_sync.py
@@ -54,4 +54,8 @@ def cli(ctx, opt_data_store, opt_dataset, opt_type, opt_dryrun):
if not opt_dryrun:
subprocess.call(cmd)
- \ No newline at end of file
+
+'''
+upload: '/data_store_ssd/datasets/people/vgg_face2/media/uuid/00418e0e-48e9-44f9-b6a0-b2ffd773802e.jpg' -> 's3://megapixels/v1/media/vgg_face2/00418e0e-48e9-44f9-b6a0-b2ffd773802e.jpg' [3202 of 3187313]
+[2953 of 3187313]
+''' \ No newline at end of file
diff --git a/megapixels/commands/demo/face_search.py b/megapixels/commands/demo/face_search.py
index 0452cc9d..34a25762 100644
--- a/megapixels/commands/demo/face_search.py
+++ b/megapixels/commands/demo/face_search.py
@@ -6,9 +6,11 @@ from app.utils import click_utils
from app.settings import app_cfg as cfg
from app.utils.logger_utils import Logger
+log = Logger.getLogger()
+
@click.command()
@click.option('-i', '--input', 'opt_fp_in', required=True,
- help='Input face image')
+ help='File to lookup')
@click.option('--data_store', 'opt_data_store',
type=cfg.DataStoreVar,
default=click_utils.get_default(types.DataStore.SSD),
@@ -19,8 +21,8 @@ from app.utils.logger_utils import Logger
required=True,
show_default=True,
help=click_utils.show_help(types.Dataset))
-@click.option('--gpu', 'opt_gpu', default=0,
- help='GPU index (use -1 for CPU)')
+@click.option('--gpu', 'opt_gpu', default=0,
+ help='GPU index (use -1 for CPU')
@click.pass_context
def cli(ctx, opt_fp_in, opt_data_store, opt_dataset, opt_gpu):
"""Display image info"""
@@ -31,18 +33,22 @@ def cli(ctx, opt_fp_in, opt_data_store, opt_dataset, opt_gpu):
from pathlib import Path
import time
- import imutils
import pandas as pd
import cv2 as cv
- import dlib
from tqdm import tqdm
-
+ import imutils
+
from app.utils import file_utils, im_utils
- from app.models.data_store import DataStore, DataStoreS3
+ from app.models.data_store import DataStore
from app.processors import face_detector
from app.processors import face_recognition
log = Logger.getLogger()
+ # init dataset
+ dataset = Dataset(opt_data_store, opt_dataset)
+ dataset.load_face_vectors()
+ dataset.load_records()
+ dataset.load_identities()
# init face detection
detector = face_detector.DetectorDLIBHOG()
@@ -52,6 +58,7 @@ def cli(ctx, opt_fp_in, opt_data_store, opt_dataset, opt_gpu):
# load query image
im_query = cv.imread(opt_fp_in)
+
# get detection as BBox object
bboxes = detector.detect(im_query, largest=True)
bbox = bboxes[0]
@@ -64,9 +71,6 @@ def cli(ctx, opt_fp_in, opt_data_store, opt_dataset, opt_gpu):
# extract the face vectors
vec_query = recognition.vec(im_query, bbox)
-
- # load dataset CSVs
- dataset = Dataset(opt_data_store, opt_dataset)
# find matches
image_records = dataset.find_matches(vec_query, n_results=5)
@@ -91,4 +95,4 @@ def cli(ctx, opt_fp_in, opt_data_store, opt_dataset, opt_gpu):
sys.exit()
elif k != 255:
# any key to continue
- break \ No newline at end of file
+ break