From 6a0cd1aa1ff3daf3705b401feefd73b3304b2a4e Mon Sep 17 00:00:00 2001 From: Jia Guo Date: Fri, 8 Dec 2017 13:54:45 +0800 Subject: [PATCH] read image_size from property file --- src/common/face2rec2.py | 12 ++++++++++-- src/common/face_image.py | 12 ++++++++++++ src/eval/do_ver.sh | 3 ++- src/eval/verification.py | 11 +++++++---- src/symbols/symbol_utils.py | 2 +- src/train_softmax.py | 16 ++++++++-------- 6 files changed, 40 insertions(+), 16 deletions(-) mode change 100644 => 100755 src/eval/do_ver.sh diff --git a/src/common/face2rec2.py b/src/common/face2rec2.py index 46b6115..a106356 100644 --- a/src/common/face2rec2.py +++ b/src/common/face2rec2.py @@ -31,6 +31,7 @@ import traceback #from builtins import range from easydict import EasyDict as edict import face_preprocess +import face_image try: import multiprocessing @@ -51,6 +52,9 @@ def read_list(path_in): item = edict() item.flag = 0 item.image_path, item.label, item.bbox, item.landmark, item.aligned = face_preprocess.parse_lst_line(line) + if not item.aligned and item.landmark is None: + print('ignore line', line) + continue item.id = _id yield item if item.label!=last[0]: @@ -89,7 +93,7 @@ def image_encode(args, i, item, q_out): else: img = cv2.imread(fullpath, args.color) assert item.landmark is not None - img = face_preprocess.preprocess(img, bbox = item.bbox, landmark=item.landmark, image_size='112,112') + img = face_preprocess.preprocess(img, bbox = item.bbox, landmark=item.landmark, image_size='%d,%d'%(args.image_h, args.image_w)) s = mx.recordio.pack_img(header, img, quality=args.quality, img_fmt=args.encoding) q_out.put((i, s, oitem)) else: #flag==1 or 2 @@ -179,7 +183,6 @@ def parse_args(): help='specify the encoding of the images.') rgroup.add_argument('--pack-label', type=bool, default=False, help='Whether to also pack multi dimensional label in the record file') - rgroup.add_argument('--image-size', type=str, default='112,96', choices=['112,96', '112,112'], help='image size, set to 112,96 or 112,112') args = parser.parse_args() args.prefix = os.path.abspath(args.prefix) #args.root = os.path.abspath(args.root) @@ -194,6 +197,11 @@ if __name__ == '__main__': working_dir = args.prefix else: working_dir = os.path.dirname(args.prefix) + prop = face_image.load_property(working_dir) + image_size = prop.image_size + print('image_size', image_size) + args.image_h = image_size[0] + args.image_w = image_size[1] files = [os.path.join(working_dir, fname) for fname in os.listdir(working_dir) if os.path.isfile(os.path.join(working_dir, fname))] count = 0 diff --git a/src/common/face_image.py b/src/common/face_image.py index e169d50..ec73b1f 100644 --- a/src/common/face_image.py +++ b/src/common/face_image.py @@ -2,6 +2,18 @@ from easydict import EasyDict as edict import os + +def load_property(data_dir): + prop = edict() + for line in open(os.path.join(data_dir, 'property')): + vec = line.strip().split(',') + assert len(vec)==3 + prop.num_classes = int(vec[0]) + prop.image_size = [int(vec[1]), int(vec[2])] + return prop + + + def get_dataset_webface(input_dir): clean_list_file = input_dir+"_clean_list.txt" ret = [] diff --git a/src/eval/do_ver.sh b/src/eval/do_ver.sh old mode 100644 new mode 100755 index 2c16d9c..31f84af --- a/src/eval/do_ver.sh +++ b/src/eval/do_ver.sh @@ -1,2 +1,3 @@ -python -u verification.py --data-dir /opt/jiaguo/faces_vgg_112x112 --image-size 112,112 --model '../../model/softmax1010d3-r101-p0_0_96_112_0,21|22|32' +#python -u verification.py --gpu 0 --data-dir /opt/jiaguo/faces_vgg_112x112 --image-size 112,112 --model '../../model/softmax1010d3-r101-p0_0_96_112_0,21|22|32' --target agedb_30 +python -u verification.py --gpu 0 --data-dir /opt/jiaguo/faces_normed --image-size 112,96 --model '../../model31/sphere-m51-p0_0_96_112_0,90' --target agedb_30 --batch-size 128 diff --git a/src/eval/verification.py b/src/eval/verification.py index 7ae554b..6c90f4b 100644 --- a/src/eval/verification.py +++ b/src/eval/verification.py @@ -38,6 +38,8 @@ import pickle from sklearn.decomposition import PCA import mxnet as mx from mxnet import ndarray as nd +sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) +import face_image @@ -250,13 +252,14 @@ if __name__ == '__main__': # general parser.add_argument('--data-dir', default='', help='') parser.add_argument('--model', default='../model/softmax,50', help='path to load model.') - parser.add_argument('--image-size', default='112,96', help='image size.') - parser.add_argument('--target', default='lfw,cfp_ff,cfp_fp', help='test targets.') + parser.add_argument('--target', default='lfw,cfp_ff,cfp_fp,agedb_30', help='test targets.') parser.add_argument('--gpu', default=0, type=int, help='gpu id') - parser.add_argument('--batch-size', default=128, type=int, help='') + parser.add_argument('--batch-size', default=32, type=int, help='') args = parser.parse_args() - image_size = [int(x) for x in args.image_size.split(',')] + prop = face_image.load_property(args.data_dir) + image_size = prop.image_size + print('image_size', image_size) ctx = mx.gpu(args.gpu) nets = [] prefix = args.model.split(',')[0] diff --git a/src/symbols/symbol_utils.py b/src/symbols/symbol_utils.py index 712573d..c76c2ce 100644 --- a/src/symbols/symbol_utils.py +++ b/src/symbols/symbol_utils.py @@ -27,7 +27,7 @@ def get_fc1(last_conv, num_classes, fc_type): pool1 = mx.sym.Pooling(data=relu1, global_pool=True, kernel=(7, 7), pool_type='avg', name='pool1') flat = mx.sym.Flatten(data=pool1) if len(fc_type)>1: - if fc_type[1]=='D': + if fc_type[1]=='X': print('dropout mode') flat = mx.symbol.Dropout(data=flat, p=0.2) fc_type = fc_type[0] diff --git a/src/train_softmax.py b/src/train_softmax.py index dd0c1ec..1df25a1 100644 --- a/src/train_softmax.py +++ b/src/train_softmax.py @@ -18,7 +18,8 @@ import mxnet as mx from mxnet import ndarray as nd import argparse import mxnet.optimizer as optimizer -#sys.path.append(os.path.join(os.path.dirname(__file__), 'common')) +sys.path.append(os.path.join(os.path.dirname(__file__), 'common')) +import face_image sys.path.append(os.path.join(os.path.dirname(__file__), 'eval')) sys.path.append(os.path.join(os.path.dirname(__file__), 'symbols')) import fresnet @@ -118,8 +119,6 @@ def parse_args(): help='feature incay') parser.add_argument('--use-deformable', type=int, default=0, help='') - parser.add_argument('--image-size', type=str, default='112,96', - help='') parser.add_argument('--patch', type=str, default='0_0_96_112_0', help='') parser.add_argument('--lr-steps', type=str, default='', @@ -284,9 +283,6 @@ def train_net(args): args.rescale_threshold = 0 args.image_channel = 3 ppatch = [int(x) for x in args.patch.split('_')] - image_size = [int(x) for x in args.image_size.split(',')] - args.image_h = image_size[0] - args.image_w = image_size[1] assert len(ppatch)==5 @@ -295,9 +291,13 @@ def train_net(args): path_imgrec = None path_imglist = None val_rec = None + prop = face_image.load_property(args.data_dir) + args.num_classes = prop.num_classes + image_size = prop.image_size + args.image_h = image_size[0] + args.image_w = image_size[1] + print('image_size', image_size) - for line in open(os.path.join(args.data_dir, 'property')): - args.num_classes = int(line.strip()) assert(args.num_classes>0) print('num_classes', args.num_classes)