Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
    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)

    
Пример #5
0
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
Пример #6
0
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