summaryrefslogtreecommitdiff
path: root/megapixels/commands/cv/face_roi.py
diff options
context:
space:
mode:
Diffstat (limited to 'megapixels/commands/cv/face_roi.py')
-rw-r--r--megapixels/commands/cv/face_roi.py67
1 files changed, 40 insertions, 27 deletions
diff --git a/megapixels/commands/cv/face_roi.py b/megapixels/commands/cv/face_roi.py
index 70fff401..e83b0f61 100644
--- a/megapixels/commands/cv/face_roi.py
+++ b/megapixels/commands/cv/face_roi.py
@@ -33,7 +33,7 @@ color_filters = {'color': 1, 'gray': 2, 'all': 3}
help='Output image size')
@click.option('-d', '--detector', 'opt_detector_type',
type=cfg.FaceDetectNetVar,
- default=click_utils.get_default(types.FaceDetectNet.DLIB_CNN),
+ default=click_utils.get_default(types.FaceDetectNet.CVDNN),
help=click_utils.show_help(types.FaceDetectNet))
@click.option('-g', '--gpu', 'opt_gpu', default=0,
help='GPU index')
@@ -97,31 +97,37 @@ def cli(ctx, opt_fp_in, opt_dir_media, opt_fp_out, opt_data_store, opt_dataset,
detector = face_detector.DetectorDLIBCNN(gpu=opt_gpu)
elif opt_detector_type == types.FaceDetectNet.DLIB_HOG:
detector = face_detector.DetectorDLIBHOG()
- elif opt_detector_type == types.FaceDetectNet.MTCNN:
- detector = face_detector.DetectorMTCNN(gpu=opt_gpu)
+ elif opt_detector_type == types.FaceDetectNet.MTCNN_TF:
+ detector = face_detector.DetectorMTCNN_TF(gpu=opt_gpu)
elif opt_detector_type == types.FaceDetectNet.HAAR:
log.error('{} not yet implemented'.format(opt_detector_type.name))
return
# get list of files to process
- fp_in = data_store.metadata(types.Metadata.FILE_RECORD) if opt_fp_in is None else opt_fp_in
- df_records = pd.read_csv(fp_in).set_index('index')
+ fp_record = data_store.metadata(types.Metadata.FILE_RECORD) if opt_fp_in is None else opt_fp_in
+ df_record = pd.read_csv(fp_record, dtype=cfg.FILE_RECORD_DTYPES).set_index('index')
if opt_slice:
- df_records = df_records[opt_slice[0]:opt_slice[1]]
- log.debug('processing {:,} files'.format(len(df_records)))
+ df_record = df_record[opt_slice[0]:opt_slice[1]]
+ log.debug('processing {:,} files'.format(len(df_record)))
# filter out grayscale
color_filter = color_filters[opt_color_filter]
# set largest flag, to keep all or only largest
- opt_largest = opt_largest == 'largest'
+ opt_largest = (opt_largest == 'largest')
data = []
+ skipped_files = []
+ processed_files = []
- for df_record in tqdm(df_records.itertuples(), total=len(df_records)):
+ for df_record in tqdm(df_record.itertuples(), total=len(df_record)):
fp_im = data_store.face(str(df_record.subdir), str(df_record.fn), str(df_record.ext))
- im = cv.imread(fp_im)
- im_resized = im_utils.resize(im, width=opt_size[0], height=opt_size[1])
+ try:
+ im = cv.imread(fp_im)
+ im_resized = im_utils.resize(im, width=opt_size[0], height=opt_size[1])
+ except Exception as e:
+ log.debug(f'could not read: {fp_im}')
+ return
# filter out color or grayscale iamges
if color_filter != color_filters['all']:
try:
@@ -134,31 +140,38 @@ def cli(ctx, opt_fp_in, opt_dir_media, opt_fp_out, opt_data_store, opt_dataset,
continue
try:
- bboxes = detector.detect(im_resized, pyramids=opt_pyramids, largest=opt_largest,
+ bboxes_norm = detector.detect(im_resized, pyramids=opt_pyramids, largest=opt_largest,
zone=opt_zone, conf_thresh=opt_conf_thresh)
except Exception as e:
log.error('could not detect: {}'.format(fp_im))
log.error('{}'.format(e))
continue
- for bbox in bboxes:
- roi = {
- 'record_index': int(df_record.Index),
- 'x': bbox.x,
- 'y': bbox.y,
- 'w': bbox.w,
- 'h': bbox.h
- }
- data.append(roi)
- if len(bboxes) == 0:
+ if len(bboxes_norm) == 0:
+ skipped_files.append(fp_im)
log.warn(f'no faces in: {fp_im}')
-
+ log.warn(f'skipped: {len(skipped_files)}. found:{len(processed_files)} files')
+ else:
+ processed_files.append(fp_im)
+ for bbox in bboxes_norm:
+ roi = {
+ 'record_index': int(df_record.Index),
+ 'x': bbox.x,
+ 'y': bbox.y,
+ 'w': bbox.w,
+ 'h': bbox.h
+ }
+ data.append(roi)
+
# if display optined
- if opt_display and len(bboxes):
+ if opt_display and len(bboxes_norm):
# draw each box
- for bbox in bboxes:
- bbox_dim = bbox.to_dim(im_resized.shape[:2][::-1])
- draw_utils.draw_bbox(im_resized, bbox_dim)
+ for bbox_norm in bboxes_norm:
+ dim = im_resized.shape[:2][::-1]
+ bbox_dim = bbox.to_dim(dim)
+ if dim[0] > 1000:
+ im_resized = im_utils.resize(im_resized, width=1000)
+ im_resized = draw_utils.draw_bbox(im_resized, bbox_norm)
# display and wait
cv.imshow('', im_resized)