def load_data(group_id, face_num=1000, max_user=None, method='vgg'): X_train = [] y_train = [] X_test = [] y_test = [] # 按用户分组从db装入特征数据, 装入所有数据 start = 0 max_length = 1000 total = 0 while 1: user_list = dbport.user_list_by_group(group_id, start=start, length=max_length) for i in tqdm(range(len(user_list))): if max_user and total >= max_user: break X = [] y = [] faces = dbport.user_face_list(group_id, user_list[i]) for f in faces[:face_num]: # 训练集 r = dbport.face_info(f) if r: e_list = get_encodings(r['encodings'], method) X_train.extend(e_list) y_train.extend([user_list[i]] * len(e_list)) for f in faces[face_num:]: # 验证集 r = dbport.face_info(f) if r: e_list = get_encodings(r['encodings'], method) X_test.extend(e_list) y_test.extend([user_list[i]] * len(e_list)) total += 1 if max_user and total >= max_user: break if len(user_list) < max_length: break else: # 未完,继续 start += max_length # y标签规范化 label_y = preprocessing.LabelEncoder() label_y.fit(y_train) y_train = label_y.transform(y_train) y_train = to_one_hot(y_train, total) y_test = label_y.transform(y_test) y_test = to_one_hot(y_test, total) return np.array(X_train), np.array(y_train), np.array(X_test), np.array( y_test), label_y
def face_verify_db(request_id, b64_data, group_id, user_id): # 获取已知用户的特征数据 face_list = user_face_list(group_id, user_id) if face_list==-1: # user_id 不存在 return None, -1 face_encodings = [face_info(i)['encodings'] for i in face_list] # 进行比较验证 is_match, score, face_array = verify.verify_vgg.is_match_b64_2(face_encodings, b64_data) if type(score)!=type([]): score = score.tolist() # np.array # 只记录结果正确的人脸数据,用于后面数据增强 if is_match>0: face_save_to_temp(group_id, request_id, 'face_verify_db', [user_id], face_array[0]) return is_match, score
def face_search_mobile_tail(request_id, b64_data, mobile_tail, group_id='DEFAULT', max_user_num=5): # 获取手机尾号的用户列表 user_list = user_list_by_mobile_tail(mobile_tail, group_id) # 获取已知用户的特征数据 face_X = [] face_y = [] user_dict = {} for user in user_list: user_dict[user['user_id']] = user face_list = user_face_list(group_id, user['user_id']) if face_list==-1: # user_id 不存在 continue for x in face_list: ec = face_info(x)['encodings']['vgg'].values() face_X.extend(ec) face_y.extend([user['user_id']]*len(ec)) # 进行识别: 与给定的用户人脸进行比较 r, face_boxes, face_array = verify.verify_vgg.is_match_b64_3((face_X, face_y), b64_data) user_list = [] for i in r[:max_user_num]: user_id = i[0] user_list.append({ 'user_id' : user_id, 'mobile_tail' : mobile_tail, # 手机后4位 'name' : user_dict[user_id]['name'], # 用户姓名 'location' : face_boxes, 'score' : i[1], # 距离 }) # 只记录有结果的人脸数据,用于后面数据增强 if len(user_list)>0: face_save_to_temp(group_id, request_id, 'face_search_mobile_tail', user_list, face_array[0]) return user_list
method = sys.argv[1] Xy_file = group_id = sys.argv[2] if method=='file': with open(Xy_file, 'rb') as f: X, y = pickle.load(f) print('Calculating...') score_acc_f1(X, y) elif method in ('db_vgg', 'db_evo', 'db_rec'): X = [] y = [] user_list = dbport.user_list_by_group(group_id, length=1000) for i in range(len(user_list)): faces_list = dbport.user_face_list(group_id, user_list[i]) for face in faces_list: r = dbport.face_info(face) e_list = r['encodings'][method[-3:]].values() X.extend(e_list) y.extend([user_list[i]]*len(e_list)) print('Calculating...') score_acc_f1(X, y, title=method[-3:]) else: print('Unknown method.') sys.exit(1)
def train(group_id, model_save_path=None, n_neighbors=None, knn_algo='ball_tree', verbose=False, face_algorithm='rec', face_num=1000, max_user=None, need_train=None): """ Trains a k-nearest neighbors classifier for face recognition. :param model_save_path: (optional) path to save model on disk :param n_neighbors: (optional) number of neighbors to weigh in classification. Chosen automatically if not specified :param knn_algo: (optional) underlying data structure to support knn.default is ball_tree :param verbose: verbosity of training :return: returns knn classifier that was trained on the given data. """ X = [] y = [] # 按用户分组从db装入特征数据, 装入所有数据 start = 0 max_length = 1000 total = 0 while 1: user_list = dbport.user_list_by_group(group_id, start=start, length=max_length, need_train=need_train) for i in tqdm(range(len(user_list))): if max_user and total >= max_user: break faces = dbport.user_face_list(group_id, user_list[i]) for f in faces[:face_num]: # 同一个人,只训练指定数量的人脸,默认1000 r = dbport.face_info(f) if r: for angle in TRAINING_ANGLE: # 旋转不同角度训练 multi2 X.append(r['encodings'][face_algorithm][str(angle)]) y.append(user_list[i]) total += 1 if max_user and total >= max_user: break if len(user_list) < max_length: break else: # 未完,继续 start += max_length print('Data loaded:', total, len(X)) # 没有可训练数据 if len(X) == 0: return None # Determine how many neighbors to use for weighting in the KNN classifier if n_neighbors is None: n_neighbors = int(round(math.sqrt(len(X)))) if verbose: print("Chose n_neighbors automatically:", n_neighbors) # Create and train the KNN classifier start_time = datetime.now() knn_clf = neighbors.KNeighborsClassifier(n_neighbors=n_neighbors, algorithm=knn_algo, weights='distance') knn_clf.fit(X, y) #print('[Time taken: {!s}]'.format(datetime.now() - start_time)) # Save the trained KNN classifier if model_save_path is not None: with open(model_save_path, 'wb') as f: pickle.dump(knn_clf, f) # 计算 threshold #opt_tau, opt_acc = score_acc_f1(X, y, show=False) #print('{}: Accuracy at threshold {:.4} = {:.4}'.format(face_algorithm, opt_tau, opt_acc)) return knn_clf
def train(group_id, encodings_index=0, model_save_path=None, n_neighbors=None, knn_algo='ball_tree', verbose=False, face_algorithm='rec'): """ Trains a k-nearest neighbors classifier for face recognition. :param model_save_path: (optional) path to save model on disk :param n_neighbors: (optional) number of neighbors to weigh in classification. Chosen automatically if not specified :param knn_algo: (optional) underlying data structure to support knn.default is ball_tree :param verbose: verbosity of training :return: returns knn classifier that was trained on the given data. """ X = [] y = [] # 按用户分组从db装入特征数据, 装入所有数据 start = 0 max_length = 1000 total = 0 while 1: user_list = dbport.user_list_by_group(group_id, start=start, length=max_length) for i in tqdm(range(len(user_list))): faces = dbport.user_face_list(group_id, user_list[i]) for f in faces: r = dbport.face_info(f) if r: X.append(r['encodings'][encodings_index]) y.append(user_list[i]) total += len(user_list) if len(user_list) < max_length: break else: # 未完,继续 start += max_length print('Data loaded:', total) # Determine how many neighbors to use for weighting in the KNN classifier if n_neighbors is None: n_neighbors = int(round(math.sqrt(len(X)))) if verbose: print("Chose n_neighbors automatically:", n_neighbors) # Create and train the KNN classifier start_time = datetime.now() svc_clf = svm.LinearSVC() svc_clf.fit(X, y) #print('[Time taken: {!s}]'.format(datetime.now() - start_time)) # Save the trained KNN classifier if model_save_path is not None: with open(model_save_path, 'wb') as f: pickle.dump(svc_clf, f) return svc_clf