Exemplo n.º 1
0
def face_recognition_image(model_path, dataset_path, filename, image_path):
    # 加载数据库的数据
    dataset_emb, names_list = load_dataset(dataset_path, filename)
    # 初始化mtcnn人脸检测
    face_detect = face_recognition.Facedetection()
    # 初始化facenet
    face_net = face_recognition.facenetEmbedding(model_path)

    image = image_processing.read_image_gbk(image_path)
    # 获取 判断标识 bounding_box crop_image
    bboxes, landmarks = face_detect.detect_face(image)
    bboxes, landmarks = face_detect.get_square_bboxes(bboxes,
                                                      landmarks,
                                                      fixed="height")
    if bboxes == [] or landmarks == []:
        print("-----no face")
        exit(0)
    # print("-----image have {} faces".format(len(bboxes)))
    face_images = image_processing.get_bboxes_image(image, bboxes,
                                                    resize_height,
                                                    resize_width)
    face_images = image_processing.get_prewhiten_images(face_images)
    pred_emb = face_net.get_embedding(face_images)
    pred_name, pred_score = compare_embadding(pred_emb, dataset_emb,
                                              names_list)
    # 在图像上绘制人脸边框和识别的结果
    show_info = [n + ':' + str(s)[:5] for n, s in zip(pred_name, pred_score)]
    print(show_info)
Exemplo n.º 2
0
    def createFeature(self, photos):
        """
            创建人脸特征,返回人脸特征向量列表
        :param photos:图片列表
        :type photos:list
        :return:embeddings列表
        :rtype:list
        """
        embeddings = []  # 用于保存人脸特征数据库
        for photo in photos:
            image = image_processing.change_image(photo)
            # 进行人脸检测,获得bounding_box
            bboxes, landmarks = face_detect.detect_face(image, False)
            # 返回人脸框和5个关键点
            bboxes = face_detect.get_square_bboxes(bboxes, landmarks)
            # 获得人脸区域
            face_images = image_processing.get_bboxes_image(
                image, bboxes, resize_height, resize_width)
            # 人脸预处理,归一化
            face_images = image_processing.get_prewhiten_images(
                face_images, normalization=True)
            # 获得人脸特征
            pred_emb = face_net.get_embedding(face_images)
            embeddings.append(pred_emb)

        embeddings = np.asarray(embeddings)  # 将元组转为列表
        print(embeddings)
        return embeddings
Exemplo n.º 3
0
def face_recognition_image(model_path, dataset_path, filename, image_path):
    # 加载数据库的数据
    dataset_emb, names_list = load_dataset(dataset_path, filename)

    # 初始化mtcnn人脸检测
    face_detect = face_recognition.FaceDetection()

    # 初始化facenet
    face_net = face_recognition.facenetEmbedding(model_path)

    # 读取待检图片
    image = image_processing.read_image_gbk(image_path)
    print("image_processing.read_image_gbk:", type(image),
          image.shape)  # <class 'numpy.ndarray'>, (616, 922, 3),(高,宽,通道)

    # 获取 判断标识 bounding_box crop_image
    bboxes, landmarks = face_detect.detect_face(image)
    bboxes, landmarks = face_detect.get_square_bboxes(
        bboxes, landmarks, fixed="height")  # 以高为基准,获得等宽的举行
    if bboxes == [] or landmarks == []:
        print("-----no face")
        exit(0)
    print("-----image have {} faces".format(len(bboxes)))

    face_images = image_processing.get_bboxes_image(
        image, bboxes, resize_height, resize_width)  # 按照bboxes截取矩形框
    face_images = image_processing.get_prewhiten_images(face_images)  # 图像归一化
    pred_emb = face_net.get_embedding(face_images)  # 获取facenet特征
    pred_name, pred_score = compare_embadding(pred_emb, dataset_emb,
                                              names_list)

    # 在图像上绘制人脸边框和识别的结果
    show_info = [n + ':' + str(s)[:5] for n, s in zip(pred_name, pred_score)]
    image_processing.show_image_bboxes_text("face_reco", image, bboxes,
                                            show_info)
Exemplo n.º 4
0
def get_face_embedding(model_path,files_list, names_list):
    # 获得embedding数据
    colorSpace="RGB"
    face_detect = face_rec.FaceDetection()
    face_net = face_rec.FacenetEmbedding(model_path)

    embeddings=[]
    label_list=[]
    for image_path, name in zip(files_list, names_list):
        print("processing image :{}".format(image_path))
        image = image_processing.read_image_gbk(image_path, colorSpace=colorSpace)
        if not isinstance(image, np.ndarray): continue
        bboxes, landmarks = face_detect.detect_face(image)
        bboxes, landmarks =face_detect.get_square_bboxes(bboxes, landmarks,fixed="height")
        if bboxes == [] or landmarks == []:
            print("-----no face")
            continue
        if len(bboxes) >= 2 or len(landmarks) >= 2:
            print("-----image have {} faces".format(len(bboxes)))
            continue
        face_images = image_processing.get_bboxes_image(image, bboxes, resize_height, resize_width)
        face_images = image_processing.get_prewhiten_images(face_images,normalization=True)
        pred_emb = face_net.get_embedding(face_images)
        embeddings.append(pred_emb)
        label_list.append(name)
    return embeddings,label_list
def face_recognition_video(model_path,dataset_path, filename,video_path):
    # 加载数据库的数据
    dataset_emb, names_list = load_dataset(dataset_path, filename)
    # 初始化mtcnn人脸检测
    face_detect = face_recognition.Facedetection()
    # 初始化facenet
    face_net = face_recognition.facenetEmbedding(model_path)

    cap = cv2.VideoCapture(video_path)  # 获取视频数据
    face_cnt = 0  # 控制视频读取时候,每秒截取指定数量图片进行一次识别
    while cap.isOpened():
        ok, frame = cap.read()
        face_cnt += 1
        if not ok:
            break
        if(face_cnt % 5 == 0):
            frame = image_processing.read_image1(frame)
            bboxes, landmarks = face_detect.detect_face(frame)
            bboxes, landmarks = face_detect.get_square_bboxes(bboxes, landmarks, fixed="height")
            if bboxes == [] or landmarks == []:
                print("-----no face")
                continue
            print("-----image have {} faces".format(len(bboxes)))
            face_images = image_processing.get_bboxes_image(frame, bboxes, resize_height, resize_width)
            face_images = image_processing.get_prewhiten_images(face_images)
            pred_emb = face_net.get_embedding(face_images)
            pred_name, pred_score = compare_embadding(pred_emb, dataset_emb, names_list)
            # 在图像上绘制人脸边框和识别的结果
            show_info = [n + ':' + str(s)[:5] for n, s in zip(pred_name, pred_score)]
            print("showinfo:", show_info)
            image_processing.show_image_bboxes_text("face_recognition", frame, bboxes, show_info)

    cap.release()
    cv2.destroyWindow("face_recognition")
Exemplo n.º 6
0
def faceRecognition(photo):
    """
    :param photo: 前端发来的照片(原生照片,没有经过任何处理)
    :type photo: numpy.ndarray
    :return: 识别结果
    :rtype:
    """
    # 人脸检测、对齐
    # bboxes人脸框信息(左上角横纵坐标、右下角横纵坐标)
    # landmarks人脸五个关键点坐标(左右眼、鼻尖、左右嘴角)
    bboxes, landmarks, image = mtcnnDetection.photo_calculation_and_processing(
        photo_path)
    # 算法要求,将照片调整为160*160,输入到facenet中
    face_images = image_processing.get_bboxes_image(image, bboxes, 160, 160)
    face_images = image_processing.get_prewhiten_images(face_images)
    # 生成face_images的128维的人脸特征向量
    pred_emb = face_net.get_embedding(face_images)

    # 调用数据库模块,返回名字列表names_list,人脸特征向量数组dataset_emb(未实现)
    # 字典形式{name:[feature0,feature1,feature2]}
    db = database.Dao()
    dic = db.nameFeature_dic()
    fF = feature.Feature()
    show_info = fF.calculateDistance(pred_emb, dic, threshold)
    print(show_info)
    if show_info is not "unkonw":
        """签到成功"""
        pass
    else:
        """签到失败"""
Exemplo n.º 7
0
def get_pair_scores(faces_data, issames_data, model_path, save_path=None):
    '''
    计算分数
    :param faces_data:
    :param issames_data:
    :param model_path: insightFace模型路径
    :param save_path:
    :return:
    '''
    faces_list1, faces_list2 = split_data(faces_data)
    face_net = face_recognition.facenetEmbedding(model_path)

    pred_score = []
    i = 0
    for face1, face2, issame in zip(faces_list1, faces_list2, issames_data):
        # pred_id, pred_scores = faceRec.predict(faces)
        # 或者使用get_faces_embedding()获得embedding,再比较compare_embedding()
        face_images1 = image_processing.get_prewhiten_images(
            [face1], normalization=False)
        face_images2 = image_processing.get_prewhiten_images(
            [face2], normalization=False)

        face_emb1 = face_net.get_embedding(face_images1)
        face_emb2 = face_net.get_embedding(face_images2)

        # face_emb1 = face_net.get_faces_embedding([face1])
        # face_emb2 = face_net.get_faces_embedding([face2])
        dist = np.sqrt(np.sum(np.square(np.subtract(face_emb1, face_emb2))))
        pred_score.append(dist)
        i += 1
        if i % 100 == 0:
            print('processing data :', i)
    pred_score = np.array(pred_score).reshape(-1)
    issames_data = issames_data + 0  # 将true和false转为1/0
    if save_path is not None:
        issames_path = os.path.join(save_path, "issames.npy")
        pred_score_path = os.path.join(save_path, "pred_score.npy")
        np.save(issames_path, issames_data)
        np.save(pred_score_path, pred_score)
    return pred_score, issames_data
Exemplo n.º 8
0
def face_recognition_image(face_detect, face_net, compared_face_path, idcard_face_path):
    # 初始化mtcnn人脸检测
    # face_detect = face_recognition.Facedetection()
    # 初始化facenet
    # face_net = face_recognition.facenetEmbedding(model_path)

    # 人脸数据是否有效
    valid = False

    compared_face = image_processing.read_image(compared_face_path)
    # 获取 判断标识 bounding_box crop_image
    bboxes, landmarks = face_detect.detect_face(compared_face)
    bboxes, landmarks = face_detect.get_square_bboxes(bboxes, landmarks, fixed="height")

    if bboxes == [] or landmarks == []:
        return valid, '未检测到人脸'
    elif len(bboxes) > 1:
        return valid, '检测到多张人脸'

    compared_face_images = image_processing.get_bboxes_image(compared_face, bboxes, resize_height, resize_width)
    compared_face_images = image_processing.get_prewhiten_images(compared_face_images)
    compared_face_emb = face_net.get_embedding(compared_face_images)

    idcard_face = image_processing.read_image(idcard_face_path)
    # 获取 判断标识 bounding_box crop_image
    bboxes, landmarks = face_detect.detect_face(idcard_face)
    bboxes, landmarks = face_detect.get_square_bboxes(bboxes, landmarks, fixed="height")

    if bboxes == [] or landmarks == []:
        return valid, '证件人脸识别错误,请重新上传'
    elif len(bboxes) > 1:
        return valid, '证件人脸识别错误,请重新上传'

    valid = True
    idcard_face_images = image_processing.get_bboxes_image(idcard_face, bboxes, resize_height, resize_width)
    idcard_face_images = image_processing.get_prewhiten_images(idcard_face_images)
    idcard_face_emb = face_net.get_embedding(idcard_face_images)

    compare_res = compare_embadding(compared_face_emb, idcard_face_emb)
    return valid, compare_res
Exemplo n.º 9
0
def get_face_embedding(model_path, files_list, names_list):
    '''
    获得embedding数据
    :param files_list: 图像列表
    :param names_list: 与files_list一一的名称列表
    :return:
    '''
    # 转换颜色空间RGB or BGR
    colorSpace = "RGB"
    # 初始化mtcnn人脸检测
    face_detect = face_recognition.FaceDetection()
    # 初始化facenet
    face_net = face_recognition.facenetEmbedding(model_path)

    embeddings = []  # 用于保存人脸特征数据库
    label_list = []  # 保存人脸label的名称,与embeddings一一对应
    for image_path, name in zip(files_list, names_list):
        print("processing image: {}".format(image_path))

        image = image_processing.read_image_gbk(image_path,
                                                colorSpace=colorSpace)
        # 进行人脸检测,获得bounding_box
        bboxes, landmarks = face_detect.detect_face(image)
        bboxes, landmarks = face_detect.get_square_bboxes(bboxes,
                                                          landmarks,
                                                          fixed="height")
        # image_processing.show_image_boxes("image",image,bboxes)
        if bboxes == [] or landmarks == []:
            print("-----no face")
            continue
        if len(bboxes) >= 2 or len(landmarks) >= 2:
            print("-----image total {} faces".format(len(bboxes)))
            continue
        # 获得人脸区域
        face_images = image_processing.get_bboxes_image(
            image, bboxes, resize_height, resize_width)
        # 人脸预处理,归一化
        face_images = image_processing.get_prewhiten_images(face_images,
                                                            normalization=True)
        # 获得人脸特征
        pred_emb = face_net.get_embedding(face_images)

        embeddings.append(pred_emb)
        # 可以选择保存image_list或者names_list作为人脸的标签
        # 测试时建议保存image_list,这样方便知道被检测人脸与哪一张图片相似
        # label_list.append(image_path)
        label_list.append(name)
    return embeddings, label_list
Exemplo n.º 10
0
def image_fix(image):
    # 处理图像,主逻辑
    bboxes, landmarks = face_detect.detect_face(image)
    bboxes, landmarks = face_detect.get_square_bboxes(bboxes,
                                                      landmarks,
                                                      fixed='height')
    if bboxes and landmarks:
        face_images = image_processing.get_bboxes_image(
            image, bboxes, resize_height, resize_width)
        face_images = image_processing.get_prewhiten_images(face_images)
        pred_emb = face_net.get_embedding(face_images)
        pred_name, pred_score = file_processing.compare_embedding(
            pred_emb, dataset_embedding, name_list)
        show_info = [
            n + ':' + str(s)[:5] for n, s in zip(pred_name, pred_score)
        ]
        image = image_processing.get_image_bboxes_text_han(
            image, bboxes, show_info)
    else:
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    return image
Exemplo n.º 11
0
def face_recognition_image_nn(dataset_emb, names_list, face_detect, face_net,
                              image):
    # 获取 判断标识 bounding_box crop_image
    image = image_processing.read_image_gbk_nn(image)
    bboxes, landmarks = face_detect.detect_face(image)
    bboxes, landmarks, nn_bboxes = face_detect.get_square_bboxes_nn(
        bboxes, landmarks, fixed="height")
    if bboxes == [] or landmarks == []:
        # print("-----no face")
        return None, None
    # print("-----image have {} faces".format(len(bboxes)))
    face_images = image_processing.get_bboxes_image(image, bboxes,
                                                    resize_height,
                                                    resize_width)
    face_images = image_processing.get_prewhiten_images(face_images)
    pred_emb = face_net.get_embedding(face_images)
    pred_name, pred_score = compare_embadding(pred_emb, dataset_emb,
                                              names_list)
    # 在图像上绘制人脸边框和识别的结果
    # show_info = [n + ':' + str(s)[:5] for n, s in zip(pred_name, pred_score)]
    # print(show_info)
    return pred_name, nn_bboxes
Exemplo n.º 12
0
def face_recognition_image():
    """
    Args:
        model_path (): facenet预训练模型的路径
        dataset_path (): 存放人脸特征数据库的路径
        filename (): 存放每张图片信息的txt文档路径
    """
    global model_path, dataset_path, filename
    # 加载人脸特征数据库的数据
    dataset_emb, names_list = load_dataset(dataset_path, filename)
    bboxes, landmarks, image = photo_calculation_and_processing()
    if bboxes == [] or landmarks == []:  # bboxes保存人脸框信息,左上角横纵坐标、右下角横纵坐标
        print("-----no face")
        exit(0)
    print("-----image have {} faces".format(len(bboxes)))
    face_images = image_processing.get_bboxes_image(
        image, bboxes, resize_height,
        resize_width)  # 将照片调整为160*160,输入到facenet中
    face_images = image_processing.get_prewhiten_images(face_images)
    pred_emb = face_net.get_embedding(face_images)  # 生成face_images的人脸特征向量
    pred_name, pred_score = compare_embadding(pred_emb, dataset_emb,
                                              names_list)
def faceRecognition(photo_path):
    """
    Args:
        model_path (): facenet预训练模型的路径
        dataset_path (): 存放人脸特征数据库的路径
        filename (): 存放每张图片信息的txt文档路径
        photo_path:进行识别的图片的路径
        分别检测到照片
    """
    # 人脸检测、对齐
    # bboxes人脸框信息(左上角横纵坐标、右下角横纵坐标)
    # landmarks人脸五个关键点坐标(左右眼、鼻尖、左右嘴角)
    bboxes, landmarks, image = mtcnnDetection.photo_calculation_and_processing(
        photo_path)
    if bboxes == [] or landmarks == []:
        # 如果图片中没有人脸
        print("-----no face")
    print("-----image have {} faces".format(len(bboxes)))
    # 算法要求,将照片调整为160*160,输入到facenet中
    face_images = image_processing.get_bboxes_image(image, bboxes, 160, 160)
    face_images = image_processing.get_prewhiten_images(face_images)
    # 生成face_images的128维人脸特征向量
    pred_emb = face_net.get_embedding(face_images)
    print(pred_emb)
Exemplo n.º 14
0
        # if (frame_count % frame_interval) == 0:    # 跳帧处理,解决算法和采集速度不匹配
        if frame_count > -1:
            frame = np.asanyarray(frame)
            if normalization:
                frame = image_processing.image_normalization(frame)

            # print("frame:", type(frame), frame.shape)    # <class 'numpy.ndarray'> (480, 640, 3),(高,宽,通道)
            bboxes, landmarks = face_detect.detect_face(frame)
            bboxes, landmarks = face_detect.get_square_bboxes(bboxes, landmarks, fixed="height")  # 以高为基准,获得等宽的矩形
            if bboxes == [] or landmarks == []:
                print("-----no face")
            else:
                print("-----now have {} faces".format(len(bboxes)))
                # print("bboxes:", bboxes)
                face_images = image_processing.get_bboxes_image(frame, bboxes, resize_height, resize_width)  # 按照bboxes截取矩形框
                face_images = image_processing.get_prewhiten_images(face_images)  # 图像归一化
                pred_emb = face_net.get_embedding(face_images)  # 获取facenet特征
                pred_name, pred_score = compare_embadding(pred_emb, dataset_emb, names_list)

                # 在图像上绘制人脸边框和识别的结果
                boxes_name = [n + ':' + str(s)[:5] for n, s in zip(pred_name, pred_score)]
                for name, box in zip(boxes_name, bboxes):
                    box = [int(b) for b in box]
                    cv2.rectangle(frame, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2, 8, 0)
                    # cv2.putText(frame, name, (box[0], box[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), thickness=2)

                    zh_cn_nums = general_util.get_zhcn_number(name)  # 中文的字数(一个中文字20个像素宽,一个英文字10个像素宽)
                    t_size = (20 * zh_cn_nums + 10 * (len(name) - zh_cn_nums), 22)
                    c2 = box[0] + t_size[0], box[1] - t_size[1] - 3  # 纵坐标,多减3目的是字上方稍留空
                    cv2.rectangle(frame, (box[0], box[1]), c2, (0, 0, 255), -1)  # filled
                    # print("t_size:", t_size, " c1:", c1, " c2:", c2)
def face_recognition_for_bzl(model_path, test_dataset, filename):
    # 加载数据库的数据
    dataset_emb, names_list = predict.load_dataset(dataset_path, filename)
    print("loadind dataset...\n names_list:{}".format(names_list))
    # 初始化mtcnn人脸检测
    face_detect = face_recognition.Facedetection()
    # 初始化facenet
    face_net = face_recognition.facenetEmbedding(model_path)

    #获得测试图片的路径和label
    filePath_list, label_list = file_processing.gen_files_labels(test_dataset)
    label_list = [name.split('_')[0] for name in label_list]
    print("filePath_list:{},label_list{}".format(len(filePath_list),
                                                 len(label_list)))

    right_num = 0
    wrong_num = 0
    detection_num = 0
    test_num = len(filePath_list)
    for image_path, label_name in zip(filePath_list, label_list):
        print("image_path:{}".format(image_path))
        # 读取图片
        image = image_processing.read_image_gbk(image_path)
        # 人脸检测
        bboxes, landmarks = face_detect.detect_face(image)
        bboxes, landmarks = face_detect.get_square_bboxes(bboxes,
                                                          landmarks,
                                                          fixed="height")
        if bboxes == [] or landmarks == []:
            print("-----no face")
            continue
        if len(bboxes) >= 2 or len(landmarks) >= 2:
            print("-----image have {} faces".format(len(bboxes)))
            continue
        # 获得人脸框区域
        face_images = image_processing.get_bboxes_image(
            image, bboxes, resize_height, resize_width)
        face_images = image_processing.get_prewhiten_images(face_images,
                                                            normalization=True)
        # face_images = image_processing.get_prewhiten_images(face_images,normalization=True)

        pred_emb = face_net.get_embedding(face_images)
        pred_name, pred_score = predict.compare_embadding(pred_emb,
                                                          dataset_emb,
                                                          names_list,
                                                          threshold=1.3)
        # 在图像上绘制人脸边框和识别的结果
        # show_info = [n + ':' + str(s)[:5] for n, s in zip(pred_name, pred_score)]
        # image_processing.show_image_text("face_recognition", image, bboxes, show_info)

        index = 0
        pred_name = pred_name[index]
        pred_score = pred_score[index]
        if pred_name == label_name:
            right_num += 1
        else:
            wrong_num += 1
        detection_num += 1
        print(
            "-------------label_name:{},pred_name:{},score:{:3.4f},status:{}".
            format(label_name, pred_name, pred_score,
                   (label_name == pred_name)))
    # 准确率
    accuracy = right_num / detection_num
    # 漏检率
    misdetection = (test_num - detection_num) / test_num
    print("-------------right_num/detection_num:{}/{},accuracy rate:{}".format(
        right_num, detection_num, accuracy))
    print(
        "-------------misdetection/all_num:{}/{},misdetection rate:{}".format(
            (test_num - detection_num), test_num, misdetection))
    def face_512_vector(self, face_images=None):

        face_images = image_processing.get_prewhiten_images(face_images)
        pred_emb = self.face_net.get_embedding(face_images)
        return pred_emb