diff options
Diffstat (limited to 'megapixels')
| -rw-r--r-- | megapixels/app/models/data_store.py | 2 | ||||
| -rw-r--r-- | megapixels/app/models/dataset.py | 18 | ||||
| -rw-r--r-- | megapixels/app/settings/types.py | 3 | ||||
| -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.py | 2 | ||||
| -rw-r--r-- | megapixels/commands/cv/face_vector.py | 2 | ||||
| -rw-r--r-- | megapixels/commands/datasets/lookup.py | 4 | ||||
| -rw-r--r-- | megapixels/commands/datasets/s3_sync.py | 6 | ||||
| -rw-r--r-- | megapixels/commands/demo/face_search.py | 26 |
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 |
