Exemplo n.º 1
0
 def search_train(self):  # 已知访客搜索初始化 后面补充10秒清空时加入这个为了人员信息管理时的更新,先判断feature_change==1
     with open('./data/index_enter.pkl', 'rb') as f:
         self.index_dict = pkl.load(f)
     with open('./data/database_enter.npy', 'rb') as f:
         self.feature_data = np.load('./data/database_enter.npy')
     self.search_eign = Search_engin(self.feature_data)
     self.search_eign.train()
Exemplo n.º 2
0
def verify_img(img):
    image1 = img
    p_id_list = []
    api_unknown = 0
    if image1 is not None:
        with open('./data/index_enter.pkl', 'rb') as f:
            index_dict = pkl.load(f)
        with open('./data/database_enter.npy', 'rb') as f:
            feature_data = np.load('./data/database_enter.npy')
        search_eign = Search_engin(feature_data)
        search_eign.train()
        #print('get image')
        image1 = cv2.flip(image1, 1)
        width = int(image1.shape[1] / 2)
        height = int(image1.shape[0] / 2)
        image = cv2.resize(image1.copy(), (width, height))

        try:
            bboxs = naivedlib.getALLFaces(image)
            print('bbox detect took ')
            bboxs = [dlib.rectangle(int(bbox.left() * downsample_ratio), int(bbox.top() * downsample_ratio),
                                    int(bbox.right() * downsample_ratio), int(bbox.bottom() * downsample_ratio))
                     for bbox in bboxs]
            facenum = len(bboxs)
            if bboxs is not None:
                for bbox in bboxs:
                    # 对每个人脸进行操作
                    #print('bbox is detected')
                    query = []
                    left_eye, right_eye = naivedlib.get_eyes(image1, bbox)
                    start = time.time()
                    save_croped, crop_image = crop_rotate_part(image1[:, :, ::-1], bbox, left_eye, right_eye,
                                                               bbox.width() * 0.895)
                    save_croped = cv2.cvtColor(save_croped, cv2.COLOR_BGR2RGB)
                    end = time.time()
                    print('\tpreprocess took {}'.format(end - start))
                    flip_image = cv2.flip(crop_image.copy(), 1)
                    crop_image = proc_img(crop_image, is_whiten=False)
                    flip_image = proc_img(flip_image, is_whiten=False)
                    query.append(crop_image[0])
                    query.append(flip_image[0])
                    prob_image = np.asarray(query)

                    start = time.time()
                    feature = extractor.extract_feature(prob_image)
                    end = time.time()
                    print('\textract feature took {}'.format(end - start))
                    feature = feature / np.linalg.norm(feature)
                    idx_list = search_eign.search(feature)  # 获取搜索后的排列
                    idx_list = [idx_list[0][i] for i in range(idx_list.shape[1])]
                    score_list = []
                    name_list = []
                    for idx in idx_list:
                        score = 1 - spatial.distance.cosine(feature, feature_data[int(idx)])
                        name = {value: key for key, value in index_dict.items()}[int(idx)]
                        score_list.append(score)
                        name_list.append(name)
                    #print(name_list)
                    #print(score_list)
                    score = 1 - spatial.distance.cosine(feature, feature_data[int(idx_list[0])])
                    #print(thresh)
                    if score > thresh:
                        p_id_list.append(name_list[0])
                    else:
                        api_unknown = api_unknown + 1

        except:
            pass
        #print(p_id_list)
    return (p_id_list, api_unknown)
Exemplo n.º 3
0
class Face_Verification(object):
    def __init__(self):
        ext_model_path = './model/facenet/inception-ring-1024.pb'
        # self.video_capture = cv2.VideoCapture(camera_Id)
        # self.video_capture = cv2.VideoCapture(HKcam)
        # self.is_camera_on = True
        self.id_image = None
        self.id_image2 = None
        self.id_image1_2 = None
        # self.probe_image = None
        self.ID_label = 0
        self.count = 0
        self.ID_lib = {}
        self.ID_name = {}
        self.feature_data = None
        self.index_dict = None
        self.unknownum = 0  # 10秒内未知人员数
        self.knownum = 0  # 10秒内已知人员数

        self.unknown_feature_read()

        self.naivedlib = NaiveDlib()
        self.extractor = Extractor(ext_model_path, gpu_fraction=0)  # gpu_fraction显存占用比例
        temp = np.ones((5, 112, 96, 1))
        self.extractor.extract_feature(im_arr=temp)
        self.query = deque(maxlen=2)

        self.search_train()

    def search_train(self):  # 已知访客搜索初始化 后面补充10秒清空时加入这个为了人员信息管理时的更新,先判断feature_change==1
        with open('./data/index_enter.pkl', 'rb') as f:
            self.index_dict = pkl.load(f)
        with open('./data/database_enter.npy', 'rb') as f:
            self.feature_data = np.load('./data/database_enter.npy')
        self.search_eign = Search_engin(self.feature_data)
        self.search_eign.train()

    def unknown_feature_read(self):
        # self.datetime = datetime.now().strftime('%Y_%m_%d')
        # self.unknownfeature_path = './data/unknown_feature.npy'
        # self.unknown_pic_path = './image_saved/{}/unknown'.format(self.datetime)
        # self.known_pic_path = './image_saved/{}/known'.format(self.datetime)
        self.unknownfeature = np.asarray([])  # 10秒内未知特征
        self.unknownum = 0
        self.knownum = 0
        self.knownlist = []  # 10秒内已知人名
        self.summary = {}  # 10秒内统计信息

    def wait_clean(self):  # 10秒数据清除和人数保存

        with open('feature_change.txt', 'r') as f:
            data = f.readline()
            feature_change = int(data)
        if feature_change == 1:
            self.search_train()
            feature_change = 0
            with open('feature_change.txt', 'w+') as f:
                f.write(str(feature_change))
        self.knownum = 0
        self.unknownum = 0
        self.unknownfeature = np.asarray([])
        self.knownlist = []

    def insert_summary(self):  # 10秒内有人进来则将这10秒的第一个人进来的时间,已知访客的p_id,已知访客人数,未知访客数,总数插入
        comtime = self.summary["comtime"]
        knownum = self.knownum
        unknownum = self.unknownum
        num = knownum + unknownum

        conn = pymysql.connect(host='localhost',
                               port=3306,
                               user='******',
                               passwd='1234567',
                               db="face_info",
                               charset="utf8"
                               )
        c = conn.cursor()
        try:
            for i in range(self.knownum):
                p_id = self.knownlist[i]

                sql = '''insert into num_info
                                                             (comtime,
                                                              p_id, 
                                                              knownum,
                                                              unknownum,
                                                              num)
                                        VALUES ('%s','%s', '%d',  '%d',  '%d')   ''' % (
                    comtime, p_id, knownum, unknownum, num)
                c.execute(sql)
                conn.commit()
            print("Table inserted successfuly")
            c.close()
            conn.close()

        except:
            print("Table inserted failed")

    def verify(self, thresh):  # 识别比对
        global VIDEO_IMAGE
        global isPass
        global first
        new_person = 0  # newperson = 1时则说明有人来
        knownflag = 0
        unknownflag = 0
        currentunknownum = 0
        currentknownum = 0
        idname = []  # 可显示id照片的编号列表
        currentDate = datetime.now().strftime('%Y_%m_%d')
        currentTime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        currentTime_img = datetime.now().strftime('%Y-%m-%d %H-%M-%S')

        # if self.pic_time != None and (datetime.datetime.now() - self.pic_time).seconds > pic_time:
        # self.image_clear()
        image1 = None
        for i in range(VIDEO_IMAGE.qsize()):
            image1 = VIDEO_IMAGE.get()
        #image1 = cv2.imread('./user_pic/13800000001.bmp')  # 加载图片测试
        if image1 is not None:
            print('get image')
            image1 = cv2.flip(image1, 1)
            width = int(image1.shape[1] / 2)
            height = int(image1.shape[0] / 2)
            image = cv2.resize(image1.copy(), (width, height))

            try:
                # total_start = time.time()
                bboxs = self.naivedlib.getALLFaces(image)
                # bbox_end = time.time()
                print('bbox detect took ')
                bboxs = [dlib.rectangle(int(bbox.left() * downsample_ratio), int(bbox.top() * downsample_ratio),
                                        int(bbox.right() * downsample_ratio), int(bbox.bottom() * downsample_ratio))
                         for bbox in bboxs]
                facenum = len(bboxs)

                if bboxs is not None:
                    new_person = 1
                    print(time.strftime('%H:%M:%S', time.localtime(time.time())))
                    for bbox in bboxs:
                        # 对每个人脸进行操作
                        print('bbox is detected')
                        query = []
                        left_eye, right_eye = self.naivedlib.get_eyes(image1, bbox)
                        start = time.time()
                        save_croped, crop_image = crop_rotate_part(image1[:, :, ::-1], bbox, left_eye, right_eye,
                                                                   bbox.width() * 0.895)
                        save_croped = cv2.cvtColor(save_croped, cv2.COLOR_BGR2RGB)

                        # bbox_temp = [bbox.left(),bbox.top(),bbox.right(),bbox.bottom()]
                        # crop_image = crop_only(image1,bbox_temp)
                        # cv2.imwrite('image.jpg',crop_image)
                        end = time.time()
                        print('\tpreprocess took {}'.format(end - start))

                        flip_image = cv2.flip(crop_image.copy(), 1)
                        crop_image = proc_img(crop_image, is_whiten=False)
                        flip_image = proc_img(flip_image, is_whiten=False)
                        query.append(crop_image[0])
                        query.append(flip_image[0])
                        prob_image = np.asarray(query)

                        start = time.time()
                        feature = self.extractor.extract_feature(prob_image)
                        end = time.time()
                        print('\textract feature took {}'.format(end - start))
                        feature = feature / np.linalg.norm(feature)
                        idx_list = self.search_eign.search(feature)  # 获取搜索后的排列
                        idx_list = [idx_list[0][i] for i in range(idx_list.shape[1])]
                        score_list = []
                        name_list = []
                        for idx in idx_list:
                            score = 1 - spatial.distance.cosine(feature, self.feature_data[int(idx)])
                            name = {value: key for key, value in self.index_dict.items()}[int(idx)]
                            score_list.append(score)
                            name_list.append(name)
                        #print(name_list)
                        #print(score_list)

                        score = 1 - spatial.distance.cosine(feature, self.feature_data[int(idx_list[0])])
                        thresh = float(thresh)
                        # print(thresh)
                        if score > thresh:
                            knownflag = 1
                            name = name_list[0]
                            if self.knownum == 0:
                                self.knownum = 1
                                first = 1
                                self.summary["comtime"] = currentTime
                                self.knownlist.append(name)
                                if not os.path.exists('./image_saved/{}'.format(currentDate)):
                                    os.mkdir('./image_saved/{}'.format(currentDate))
                                    os.mkdir('./image_saved/{}/unknown'.format(currentDate))
                                    os.mkdir('./image_saved/{}/known'.format(currentDate))
                                cv2.imwrite('./image_saved/{}/known/{}_{}.jpg'.format(currentDate, currentTime_img,
                                                                                      name),
                                            save_croped)
                                idname.append(name)  # 当前帧中的已知访客name
                                print("欢迎" + name)
                                print("推送")
                                push_info = self.push_summary_known(name)
                                s = json.dumps(push_info)
                                r = requests.post(faceverify_post_url, data=s)
                                print(r)
                                #face.insert_summary()
                                # print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
                            else:

                                if name not in self.knownlist:
                                    self.knownlist.append(name)
                                    self.knownum = self.knownum + 1
                                    cv2.imwrite('./image_saved/{}/known/{}_{}.jpg'.format(currentDate, currentTime_img,
                                                                                          name),
                                                save_croped)
                                    idname.append(name)  # 当前帧中的已知访客name

                                    print("欢迎" + name)
                                    print("推送")
                                    push_info = self.push_summary_known(name)
                                    s = json.dumps(push_info)
                                    r = requests.post(faceverify_post_url, data=s)
                                    print(r)
                                    #face.insert_summary()
                                    # print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))

                        else:
                            unknownflag = 1
                            if self.unknownum == 0:
                                print("第一个未知人员")
                                first = 1
                                currentunknownum = currentunknownum + 1
                                self.unknownum = 1
                                if self.summary == []:
                                    self.summary["comtime"] = currentTime
                                if not os.path.exists('./image_saved/{}'.format(currentDate)):
                                    os.mkdir('./image_saved/{}'.format(currentDate))
                                    os.mkdir('./image_saved/{}/unknown'.format(currentDate))
                                    os.mkdir('./image_saved/{}/known'.format(currentDate))

                                cv2.imwrite('./image_saved/{}/unknown/{}_{}.jpg'.format(currentDate, currentTime_img,
                                                                                        self.unknownum), save_croped)
                                self.unknownfeature = feature[np.newaxis, :]
                                print("推送")
                                push_info = self.push_summary_unknown()
                                s = json.dumps(push_info)
                                r = requests.post(faceverify_post_url, data=s)
                                print(r)
                               # face.insert_summary()
                            else:
                                unthresh = 0.5
                                self.search_eign_unknown = Search_engin(self.unknownfeature)  # 未知访客搜索
                                self.search_eign_unknown.train()
                                unknown_idx = self.search_eign_unknown.search(feature)
                                unknown_idx = [unknown_idx[0][i] for i in range(unknown_idx.shape[1])]
                                print(unknown_idx)
                                uscore = 1 - spatial.distance.cosine(feature, self.unknownfeature[int(unknown_idx[0])])
                                print(uscore)
                                if uscore < unthresh:  # 第一次识别出该未知人员
                                    self.unknownum = self.unknownum + 1
                                    currentunknownum = currentunknownum + 1
                                    # self.unknownlist[self.unknownum] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                                    cv2.imwrite(
                                        './image_saved/{}/unknown/{}_{}.jpg'.format(currentDate, currentTime_img,
                                                                                    self.unknownum), save_croped)
                                    self.unknownfeature = np.vstack((self.unknownfeature, feature))
                                    print("推送")
                                    push_info = self.push_summary_unknown()
                                    s = json.dumps(push_info)
                                    r = requests.post(faceverify_post_url, data=s)
                                    print(r)
                                    #face.insert_summary()
                else:
                    new_person = 0
            except:
                pass
        else:
            print("图片为空!")
        return (new_person)

    def push_summary(self):  # 推送汇总
        dict_push = {}
        if self.knownum != 0:
            dict_push["known"] = "{}".format(self.knownum)
            dict_push["unknown"] = "{}".format(self.unknownum)
            for i in range(self.knownum):
                p_id = self.knownlist[i]
                result = getperson_tables(p_id)

                #image_url = result[0][3]
                image_url = "http://" + host_ip + ":5000" + "/user_pic/{}".format(p_id)
                count, lasttime = select_tables(p_id)

                dict_push["person_{}".format(i)] = {"count": "{}".format(count), "lasttime": "{}".format(lasttime),
                                                    "image": image_url}
        else:
            # 全是未知人员
            dict_push["known"] = 0
            dict_push["unknown"] = "{}".format(self.unknownum)
        return (dict_push)
    def push_summary_known(self,p_id):
        dict_push = {}

        #result = getperson_tables(p_id)

                # image_url = result[0][3]
        image_url = "http://" + host_ip + ":5000" + "/user_pic/{}".format(p_id)
        count, lasttime = select_tables(p_id)

        dict_push["data"] = {"p_id":"{}".format(p_id),"count": "{}".format(count), "lasttime": "{}".format(lasttime),
                                                    "image": image_url}

        return (dict_push)
    def push_summary_unknown(self):
        dict_push = {}
        dict_push["data"] = "unknown!"
        return (dict_push)
Exemplo n.º 4
0
    def verify(self, thresh):  # 识别比对
        global VIDEO_IMAGE
        global isPass
        global first
        new_person = 0  # newperson = 1时则说明有人来
        knownflag = 0
        unknownflag = 0
        currentunknownum = 0
        currentknownum = 0
        idname = []  # 可显示id照片的编号列表
        currentDate = datetime.now().strftime('%Y_%m_%d')
        currentTime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        currentTime_img = datetime.now().strftime('%Y-%m-%d %H-%M-%S')

        # if self.pic_time != None and (datetime.datetime.now() - self.pic_time).seconds > pic_time:
        # self.image_clear()
        image1 = None
        for i in range(VIDEO_IMAGE.qsize()):
            image1 = VIDEO_IMAGE.get()
        #image1 = cv2.imread('./user_pic/13800000001.bmp')  # 加载图片测试
        if image1 is not None:
            print('get image')
            image1 = cv2.flip(image1, 1)
            width = int(image1.shape[1] / 2)
            height = int(image1.shape[0] / 2)
            image = cv2.resize(image1.copy(), (width, height))

            try:
                # total_start = time.time()
                bboxs = self.naivedlib.getALLFaces(image)
                # bbox_end = time.time()
                print('bbox detect took ')
                bboxs = [dlib.rectangle(int(bbox.left() * downsample_ratio), int(bbox.top() * downsample_ratio),
                                        int(bbox.right() * downsample_ratio), int(bbox.bottom() * downsample_ratio))
                         for bbox in bboxs]
                facenum = len(bboxs)

                if bboxs is not None:
                    new_person = 1
                    print(time.strftime('%H:%M:%S', time.localtime(time.time())))
                    for bbox in bboxs:
                        # 对每个人脸进行操作
                        print('bbox is detected')
                        query = []
                        left_eye, right_eye = self.naivedlib.get_eyes(image1, bbox)
                        start = time.time()
                        save_croped, crop_image = crop_rotate_part(image1[:, :, ::-1], bbox, left_eye, right_eye,
                                                                   bbox.width() * 0.895)
                        save_croped = cv2.cvtColor(save_croped, cv2.COLOR_BGR2RGB)

                        # bbox_temp = [bbox.left(),bbox.top(),bbox.right(),bbox.bottom()]
                        # crop_image = crop_only(image1,bbox_temp)
                        # cv2.imwrite('image.jpg',crop_image)
                        end = time.time()
                        print('\tpreprocess took {}'.format(end - start))

                        flip_image = cv2.flip(crop_image.copy(), 1)
                        crop_image = proc_img(crop_image, is_whiten=False)
                        flip_image = proc_img(flip_image, is_whiten=False)
                        query.append(crop_image[0])
                        query.append(flip_image[0])
                        prob_image = np.asarray(query)

                        start = time.time()
                        feature = self.extractor.extract_feature(prob_image)
                        end = time.time()
                        print('\textract feature took {}'.format(end - start))
                        feature = feature / np.linalg.norm(feature)
                        idx_list = self.search_eign.search(feature)  # 获取搜索后的排列
                        idx_list = [idx_list[0][i] for i in range(idx_list.shape[1])]
                        score_list = []
                        name_list = []
                        for idx in idx_list:
                            score = 1 - spatial.distance.cosine(feature, self.feature_data[int(idx)])
                            name = {value: key for key, value in self.index_dict.items()}[int(idx)]
                            score_list.append(score)
                            name_list.append(name)
                        #print(name_list)
                        #print(score_list)

                        score = 1 - spatial.distance.cosine(feature, self.feature_data[int(idx_list[0])])
                        thresh = float(thresh)
                        # print(thresh)
                        if score > thresh:
                            knownflag = 1
                            name = name_list[0]
                            if self.knownum == 0:
                                self.knownum = 1
                                first = 1
                                self.summary["comtime"] = currentTime
                                self.knownlist.append(name)
                                if not os.path.exists('./image_saved/{}'.format(currentDate)):
                                    os.mkdir('./image_saved/{}'.format(currentDate))
                                    os.mkdir('./image_saved/{}/unknown'.format(currentDate))
                                    os.mkdir('./image_saved/{}/known'.format(currentDate))
                                cv2.imwrite('./image_saved/{}/known/{}_{}.jpg'.format(currentDate, currentTime_img,
                                                                                      name),
                                            save_croped)
                                idname.append(name)  # 当前帧中的已知访客name
                                print("欢迎" + name)
                                print("推送")
                                push_info = self.push_summary_known(name)
                                s = json.dumps(push_info)
                                r = requests.post(faceverify_post_url, data=s)
                                print(r)
                                #face.insert_summary()
                                # print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
                            else:

                                if name not in self.knownlist:
                                    self.knownlist.append(name)
                                    self.knownum = self.knownum + 1
                                    cv2.imwrite('./image_saved/{}/known/{}_{}.jpg'.format(currentDate, currentTime_img,
                                                                                          name),
                                                save_croped)
                                    idname.append(name)  # 当前帧中的已知访客name

                                    print("欢迎" + name)
                                    print("推送")
                                    push_info = self.push_summary_known(name)
                                    s = json.dumps(push_info)
                                    r = requests.post(faceverify_post_url, data=s)
                                    print(r)
                                    #face.insert_summary()
                                    # print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))

                        else:
                            unknownflag = 1
                            if self.unknownum == 0:
                                print("第一个未知人员")
                                first = 1
                                currentunknownum = currentunknownum + 1
                                self.unknownum = 1
                                if self.summary == []:
                                    self.summary["comtime"] = currentTime
                                if not os.path.exists('./image_saved/{}'.format(currentDate)):
                                    os.mkdir('./image_saved/{}'.format(currentDate))
                                    os.mkdir('./image_saved/{}/unknown'.format(currentDate))
                                    os.mkdir('./image_saved/{}/known'.format(currentDate))

                                cv2.imwrite('./image_saved/{}/unknown/{}_{}.jpg'.format(currentDate, currentTime_img,
                                                                                        self.unknownum), save_croped)
                                self.unknownfeature = feature[np.newaxis, :]
                                print("推送")
                                push_info = self.push_summary_unknown()
                                s = json.dumps(push_info)
                                r = requests.post(faceverify_post_url, data=s)
                                print(r)
                               # face.insert_summary()
                            else:
                                unthresh = 0.5
                                self.search_eign_unknown = Search_engin(self.unknownfeature)  # 未知访客搜索
                                self.search_eign_unknown.train()
                                unknown_idx = self.search_eign_unknown.search(feature)
                                unknown_idx = [unknown_idx[0][i] for i in range(unknown_idx.shape[1])]
                                print(unknown_idx)
                                uscore = 1 - spatial.distance.cosine(feature, self.unknownfeature[int(unknown_idx[0])])
                                print(uscore)
                                if uscore < unthresh:  # 第一次识别出该未知人员
                                    self.unknownum = self.unknownum + 1
                                    currentunknownum = currentunknownum + 1
                                    # self.unknownlist[self.unknownum] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                                    cv2.imwrite(
                                        './image_saved/{}/unknown/{}_{}.jpg'.format(currentDate, currentTime_img,
                                                                                    self.unknownum), save_croped)
                                    self.unknownfeature = np.vstack((self.unknownfeature, feature))
                                    print("推送")
                                    push_info = self.push_summary_unknown()
                                    s = json.dumps(push_info)
                                    r = requests.post(faceverify_post_url, data=s)
                                    print(r)
                                    #face.insert_summary()
                else:
                    new_person = 0
            except:
                pass
        else:
            print("图片为空!")
        return (new_person)
Exemplo n.º 5
0
    def verify(self, thresh):
        global VIDEO_IMAGE
        global isPass
        knownflag = 0
        unknownflag = 0
        currentunknownum = 0
        currentknownum = 0
        idname = []  # 可显示id照片的编号列表
        currentDate = datetime.now().strftime('%Y_%m_%d')
        currentTime = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
        if currentDate != self.datetime: #新日期触发
            self.today_clean(self.datetime)
            self.datetime = currentDate
        web = Web_Browser()
        web.setModal(False)
        web.setWindowTitle(_translate("Face_Verification", "比对结果", None))
        # if self.pic_time != None and (datetime.datetime.now() - self.pic_time).seconds > pic_time:
            # self.image_clear()

        for i in range(probe_image.qsize()):
            image1 = probe_image.get()
        #image1 = cv2.imread('./card/2.jpg')  # 加载图片测试
        if image1 is not None:
            print('get image')
            image1 = cv2.flip(image1, 1)
            width = int(image1.shape[1] / 2)
            height = int(image1.shape[0] / 2)
            image = cv2.resize(image1.copy(), (width, height))

            try:
                    #total_start = time.time()
                    bboxs = self.naivedlib.getALLFaces(image)
                    #bbox_end = time.time()
                    print('bbox detect took ')
                    bboxs = [dlib.rectangle(int(bbox.left() * downsample_ratio), int(bbox.top() * downsample_ratio),
                                            int(bbox.right() * downsample_ratio), int(bbox.bottom() * downsample_ratio))
                             for bbox in bboxs]
                    facenum = len(bboxs)

                    #print(facenum)#人脸数
                    # index_list = []
                    #idname = []  # 可显示id照片的编号列表
                    if bboxs is not None:
                        print(time.strftime('%H:%M:%S', time.localtime(time.time())))
                        for bbox in bboxs:
                            # 对每个人脸进行操作
                            print('bbox is detected')
                            query = []
                            left_eye, right_eye = self.naivedlib.get_eyes(image1, bbox)
                            start = time.time()
                            save_croped, crop_image = crop_rotate_part(image1[:, :, ::-1], bbox, left_eye, right_eye,
                                                                       bbox.width() * 0.895)
                            save_croped = cv2.cvtColor(save_croped, cv2.COLOR_BGR2RGB)

                            # bbox_temp = [bbox.left(),bbox.top(),bbox.right(),bbox.bottom()]
                            # crop_image = crop_only(image1,bbox_temp)
                            # cv2.imwrite('image.jpg',crop_image)
                            end = time.time()
                            print('\tpreprocess took {}'.format(end - start))

                            flip_image = cv2.flip(crop_image.copy(), 1)
                            crop_image = proc_img(crop_image, is_whiten=False)
                            flip_image = proc_img(flip_image, is_whiten=False)
                            query.append(crop_image[0])
                            query.append(flip_image[0])
                            prob_image = np.asarray(query)

                            start = time.time()
                            feature = self.extractor.extract_feature(prob_image)
                            end = time.time()
                            print('\textract feature took {}'.format(end - start))
                            feature = feature / np.linalg.norm(feature)
                            idx_list = self.search_eign.search(feature)  # 获取搜索后的排列
                            idx_list = [idx_list[0][i] for i in range(idx_list.shape[1])]
                            score_list = []
                            name_list = []
                            for idx in idx_list:
                                score = 1 - spatial.distance.cosine(feature, self.feature_data[int(idx)])
                                name = {value: key for key, value in self.index_dict.items()}[int(idx)]
                                score_list.append(score)
                                name_list.append(name)
                            print(name_list)
                            print(score_list)
                            #person_list = [name.split('_')[0] for name in name_list]
                            #person_set = list(set(person_list))
                            #person_num = len(person_set)
                            #print(person_num)

                            score = 1 - spatial.distance.cosine(feature, self.feature_data[int(idx_list[0])])
                            thresh = float(thresh)
                            print(thresh)
                            if score > thresh:
                                knownflag = 1
                                name = name_list[0]
                                if self.knownum == 0:
                                    self.knownum = 1
                                    if not os.path.exists('./image_saved/{}'.format(currentDate)):
                                        os.mkdir('./image_saved/{}'.format(currentDate))
                                        os.mkdir('./image_saved/{}/unknown'.format(currentDate))
                                        os.mkdir('./image_saved/{}/known'.format(currentDate))
                                    cv2.imwrite('./image_saved/{}/known/{}_{}.jpg'.format(currentDate, currentTime,
                                                                                            name),
                                                save_croped)
                                    idname.append(name) #当前帧中的已知访客name
                                    print("欢迎" + name)
                                    print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
                                else:
                                    img_list = os.listdir(self.known_pic_path)  # 返回指定的文件夹包含的文件或文件夹的名字的列表
                                    knownlist = [item.split('.')[0] for item in img_list]
                                    knownlist = [item.split('_')[1] for item in knownlist]
                                    if name not in knownlist:
                                        cv2.imwrite('./image_saved/{}/known/{}_{}.jpg'.format(currentDate, currentTime,
                                                                                            name),
                                                save_croped)
                                        idname.append(name) #当前帧中的已知访客name
                                        self.knownum = self.knownum + 1
                                        print("欢迎" + name)
                                        print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))

                            else:
                                unknownflag = 1
                                if self.unknownum == 0:
                                    print("第一个未知人员")
                                    currentunknownum = currentunknownum + 1
                                    self.unknownum = 1
                                    #self.unknownlist[self.unknownum] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                                    if not os.path.exists('./image_saved/{}'.format(currentDate)):
                                        os.mkdir('./image_saved/{}'.format(currentDate))
                                        os.mkdir('./image_saved/{}/unknown'.format(currentDate))
                                        os.mkdir('./image_saved/{}/known'.format(currentDate))

                                    cv2.imwrite('./image_saved/{}/unknown/{}_{}.jpg'.format(currentDate, currentTime,
                                                                                        self.unknownum),save_croped)
                                    self.unknownfeature = feature[np.newaxis, :]

                                else:
                                    unthresh = 0.6
                                    self.search_eign_unknown = Search_engin(self.unknownfeature)  # 未知访客搜索
                                    self.search_eign_unknown.train()
                                    unknown_idx = self.search_eign_unknown.search(feature)
                                    unknown_idx = [unknown_idx[0][i] for i in range(unknown_idx.shape[1])]
                                    print(unknown_idx)
                                    uscore = 1 - spatial.distance.cosine(feature, self.unknownfeature[int(unknown_idx[0])])
                                    print(uscore)
                                    if uscore < unthresh: # 当天第一次识别出该未知人员
                                        self.unknownum = self.unknownum + 1
                                        currentunknownum = currentunknownum + 1
                                        #self.unknownlist[self.unknownum] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                                        cv2.imwrite('./image_saved/{}/unknown/{}_{}.jpg'.format(currentDate, currentTime,
                                                                                    self.unknownum), save_croped)
                                        self.unknownfeature = np.vstack((self.unknownfeature, feature))
                                        #print("第二个")
                                        #print(time.strftime('%H:%M:%S', time.localtime(time.time())))

                        if knownflag == 1:
                            #print(idname)
                            currentknownum = len(idname)  # 当前帧已知访客数量
                            #self.knownum = self.knownum + currentknownum
                            for i in range(currentknownum):
                                self.id_image = cv2.imread('./user_pic/{}.bmp'.format(idname[i]))
                                self.display_id_image(self.knownum)
                        if unknownflag == 1:
                            print("未知人总数:{}".format(self.unknownum))
                           # print("当前帧未知人数:{}".format(currentunknownum))
                            with open(self.unknownfeature_path, 'wb') as f:
                                self.unknownfeature = np.asarray(self.unknownfeature)
                                np.save(f, self.unknownfeature)
                            for i in range(currentunknownum):
                                self.id_image2 = cv2.imread('./image_saved/{}/unknown/{}_{}.jpg'.format(currentDate, currentTime, self.unknownum))
                                self.display_id_image2(self.unknownum)

                        #print(time.strftime('%H:%M:%S', time.localtime(time.time())))
                    else:

                        web.write_result("未检测到人脸", 'red')
                        web.exec_()

            except:
                    pass
        else:
            pass
Exemplo n.º 6
0
class Ui_Face_Verification(object):     #主界面
    def __init__(self):
        ext_model_path = './model/facenet/inception-ring-1024.pb'
        #self.video_capture = cv2.VideoCapture(camera_Id)
        #self.video_capture = cv2.VideoCapture(HKcam)
        self.is_camera_on = True
        self.id_image = None
        self.id_image2 = None
        self.id_image1_2 = None
        self.probe_image = None
        self.ID_label = 0
        self.count = 0
        self.ID_lib = {}
        self.ID_name = {}
        self.feature_data = None
        self.index_dict = None
        self.unknownum = 0  #当天未知人员总数
        self.knownum = 0



        #self.unknownfeature = np.asarray([]) #当天保存的未知访客的特征
        self.datetime = datetime.now().strftime('%Y_%m_%d')
        self.unknown_feature_read()


        #self.persontime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

        self.naivedlib = NaiveDlib()
        self.extractor = Extractor(ext_model_path, gpu_fraction=0)#gpu_fraction显存占用比例
        temp = np.ones((5, 112, 96, 1))
        self.extractor.extract_feature(im_arr=temp)
        self.query = deque(maxlen=2)

        self.search_train()
        self.start()
        self.start_verify()



    def setupUi(self, Face_Verification):
        Face_Verification.setObjectName(_fromUtf8("Face_Verification"))
        # Face_Verification.setEnabled(True)
        # Face_Verification.resize(1301, 810)
        Face_Verification.setFixedSize(1300, 810)  # 界面固定大小
        Face_Verification.setStyleSheet(_fromUtf8("background-color: rgb(240, 248, 255);"))  # 界面背景色
        # Face_Verification.setStyleSheet(_fromUtf8("background-color: rgb(255, 222, 173);"))
        self.centralwidget = QtGui.QWidget(Face_Verification)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))

        self.horizontalLayoutWidget = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 40, 131, 161))
        self.horizontalLayoutWidget.setObjectName(_fromUtf8("horizontalLayoutWidget"))
        self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.ID_photo1 = QtGui.QLabel(self.horizontalLayoutWidget)
        self.ID_photo1.setText(_fromUtf8(""))
        self.ID_photo1.setObjectName(_fromUtf8("ID_photo1"))
        self.ID_photo1.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout.addWidget(self.ID_photo1)

        self.horizontalLayoutWidget_13 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_13.setGeometry(QtCore.QRect(1050, 10, 151, 151))
        self.horizontalLayoutWidget_13.setObjectName(_fromUtf8("horizontalLayoutWidget_13"))
        self.horizontalLayout_13 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_13)
        self.horizontalLayout_13.setObjectName(_fromUtf8("horizontalLayout_13"))
        self.logo = QtGui.QLabel(self.horizontalLayoutWidget_13)
        self.logo.setText(_fromUtf8(""))
        self.logo.setObjectName(_fromUtf8("logo"))
        self.logo.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_13.addWidget(self.logo)

        self.horizontalLayoutWidget_2 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(160, 40, 131, 161))
        self.horizontalLayoutWidget_2.setObjectName(_fromUtf8("horizontalLayoutWidget_2"))
        self.horizontalLayout_2 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_2)
        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
        self.ID_photo2 = QtGui.QLabel(self.horizontalLayoutWidget_2)
        self.ID_photo2.setText(_fromUtf8(""))
        self.ID_photo2.setObjectName(_fromUtf8("ID_photo2"))
        self.ID_photo2.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_2.addWidget(self.ID_photo2)

        self.horizontalLayoutWidget_3 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_3.setGeometry(QtCore.QRect(300, 40, 131, 161))
        self.horizontalLayoutWidget_3.setObjectName(_fromUtf8("horizontalLayoutWidget_3"))
        self.horizontalLayout_3 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_3)
        self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
        self.ID_photo3 = QtGui.QLabel(self.horizontalLayoutWidget_3)
        self.ID_photo3.setText(_fromUtf8(""))
        self.ID_photo3.setObjectName(_fromUtf8("ID_photo3"))
        self.ID_photo3.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_3.addWidget(self.ID_photo3)
        self.horizontalLayoutWidget_4 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_4.setGeometry(QtCore.QRect(20, 210, 131, 161))
        self.horizontalLayoutWidget_4.setObjectName(_fromUtf8("horizontalLayoutWidget_4"))
        self.horizontalLayout_4 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_4)
        self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4"))
        self.ID_photo4 = QtGui.QLabel(self.horizontalLayoutWidget_4)
        self.ID_photo4.setText(_fromUtf8(""))
        self.ID_photo4.setObjectName(_fromUtf8("ID_photo4"))
        self.ID_photo4.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_4.addWidget(self.ID_photo4)
        self.horizontalLayoutWidget_5 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_5.setGeometry(QtCore.QRect(160, 210, 131, 161))
        self.horizontalLayoutWidget_5.setObjectName(_fromUtf8("horizontalLayoutWidget_5"))
        self.horizontalLayout_5 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_5)
        self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5"))
        self.ID_photo5 = QtGui.QLabel(self.horizontalLayoutWidget_5)
        self.ID_photo5.setText(_fromUtf8(""))
        self.ID_photo5.setObjectName(_fromUtf8("ID_photo5"))
        self.ID_photo5.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_5.addWidget(self.ID_photo5)
        self.horizontalLayoutWidget_6 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_6.setGeometry(QtCore.QRect(300, 210, 131, 161))
        self.horizontalLayoutWidget_6.setObjectName(_fromUtf8("horizontalLayoutWidget_6"))
        self.horizontalLayout_6 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_6)
        self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6"))
        self.ID_photo6 = QtGui.QLabel(self.horizontalLayoutWidget_6)
        self.ID_photo6.setText(_fromUtf8(""))
        self.ID_photo6.setObjectName(_fromUtf8("ID_photo6"))
        self.ID_photo6.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_6.addWidget(self.ID_photo6)
        self.verticalLayoutWidget = QtGui.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(560, 170, 681, 551))
        self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.Probe_photo = QtGui.QLabel(self.verticalLayoutWidget)
        self.Probe_photo.setText(_fromUtf8(""))
        self.Probe_photo.setObjectName(_fromUtf8("Probe_photo"))
        self.Probe_photo.setAlignment(QtCore.Qt.AlignCenter)
        self.verticalLayout.addWidget(self.Probe_photo)
        self.horizontalLayoutWidget_7 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_7.setGeometry(QtCore.QRect(20, 410, 131, 161))
        self.horizontalLayoutWidget_7.setObjectName(_fromUtf8("horizontalLayoutWidget_7"))
        self.horizontalLayout_7 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_7)
        self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7"))
        self.ID_photo1_2 = QtGui.QLabel(self.horizontalLayoutWidget_7)  # 未知照片
        self.ID_photo1_2.setText(_fromUtf8(""))
        self.ID_photo1_2.setObjectName(_fromUtf8("ID_photo1_2"))
        self.ID_photo1_2.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_7.addWidget(self.ID_photo1_2)
        self.horizontalLayoutWidget_8 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_8.setGeometry(QtCore.QRect(160, 410, 131, 161))
        self.horizontalLayoutWidget_8.setObjectName(_fromUtf8("horizontalLayoutWidget_8"))
        self.horizontalLayout_8 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_8)
        self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8"))
        self.ID_photo1_3 = QtGui.QLabel(self.horizontalLayoutWidget_8)
        self.ID_photo1_3.setText(_fromUtf8(""))
        self.ID_photo1_3.setObjectName(_fromUtf8("ID_photo1_3"))
        self.ID_photo1_3.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_8.addWidget(self.ID_photo1_3)
        self.horizontalLayoutWidget_9 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_9.setGeometry(QtCore.QRect(300, 410, 131, 161))
        self.horizontalLayoutWidget_9.setObjectName(_fromUtf8("horizontalLayoutWidget_9"))
        self.horizontalLayout_9 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_9)
        self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9"))
        self.ID_photo1_4 = QtGui.QLabel(self.horizontalLayoutWidget_9)
        self.ID_photo1_4.setText(_fromUtf8(""))
        self.ID_photo1_4.setObjectName(_fromUtf8("ID_photo1_4"))
        self.ID_photo1_4.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_9.addWidget(self.ID_photo1_4)
        self.horizontalLayoutWidget_10 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_10.setGeometry(QtCore.QRect(20, 580, 131, 161))
        self.horizontalLayoutWidget_10.setObjectName(_fromUtf8("horizontalLayoutWidget_10"))
        self.horizontalLayout_10 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_10)
        self.horizontalLayout_10.setObjectName(_fromUtf8("horizontalLayout_10"))
        self.ID_photo1_5 = QtGui.QLabel(self.horizontalLayoutWidget_10)
        self.ID_photo1_5.setText(_fromUtf8(""))
        self.ID_photo1_5.setObjectName(_fromUtf8("ID_photo1_5"))
        self.ID_photo1_5.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_10.addWidget(self.ID_photo1_5)
        self.horizontalLayoutWidget_11 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_11.setGeometry(QtCore.QRect(160, 580, 131, 161))
        self.horizontalLayoutWidget_11.setObjectName(_fromUtf8("horizontalLayoutWidget_11"))
        self.horizontalLayout_11 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_11)
        self.horizontalLayout_11.setObjectName(_fromUtf8("horizontalLayout_11"))
        self.ID_photo1_6 = QtGui.QLabel(self.horizontalLayoutWidget_11)
        self.ID_photo1_6.setText(_fromUtf8(""))
        self.ID_photo1_6.setObjectName(_fromUtf8("ID_photo1_6"))
        self.ID_photo1_6.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_11.addWidget(self.ID_photo1_6)
        self.horizontalLayoutWidget_12 = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_12.setGeometry(QtCore.QRect(300, 580, 131, 161))
        self.horizontalLayoutWidget_12.setObjectName(_fromUtf8("horizontalLayoutWidget_12"))
        self.horizontalLayout_12 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_12)
        self.horizontalLayout_12.setObjectName(_fromUtf8("horizontalLayout_12"))
        self.ID_photo1_7 = QtGui.QLabel(self.horizontalLayoutWidget_12)
        self.ID_photo1_7.setText(_fromUtf8(""))
        self.ID_photo1_7.setObjectName(_fromUtf8("ID_photo1_7"))
        self.ID_photo1_7.setAlignment(QtCore.Qt.AlignCenter)
        self.horizontalLayout_12.addWidget(self.ID_photo1_7)
        self.label = QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 10, 111, 21))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("微软雅黑"))
        font.setPointSize(10)
        self.label.setFont(font)
        self.label.setObjectName(_fromUtf8("label"))
        self.label_2 = QtGui.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 380, 111, 21))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("微软雅黑"))
        font.setPointSize(10)
        self.label_2.setFont(font)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.label_3 = QtGui.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(760, 60, 261, 81))

        font = QtGui.QFont()
        font.setFamily(_fromUtf8("微软雅黑"))
        font.setBold(1)
        font.setPointSize(24)

        self.label_3.setFont(font)
        self.label_3.setObjectName(_fromUtf8("label_3"))
        Face_Verification.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(Face_Verification)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1366, 23))
        self.menubar.setObjectName(_fromUtf8("menubar"))

        self.menu = QtGui.QMenu(self.menubar)
        self.menu.setObjectName(_fromUtf8("menu"))

        self.menu2 = QtGui.QMenu(self.menubar)
        self.menu2.setObjectName(_fromUtf8("menu2"))

        Face_Verification.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(Face_Verification)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        Face_Verification.setStatusBar(self.statusbar)
        self.action_check = QtGui.QAction(Face_Verification)
        self.action_check.setObjectName(_fromUtf8("action_check"))
        self.action_thresh = QtGui.QAction(Face_Verification)
        self.action_thresh.setObjectName(_fromUtf8("action_thresh"))
        self.action_camera_on = QtGui.QAction(Face_Verification)
        self.action_camera_on.setObjectName(_fromUtf8("action_camera_on"))
        self.action_camera_off = QtGui.QAction(Face_Verification)
        self.action_camera_off.setObjectName(_fromUtf8("action_camera_off"))

        self.menu.addAction(self.action_check)
        self.menu.addAction(self.action_thresh)
        self.menubar.addAction(self.menu.menuAction())

        self.menu2.addAction(self.action_camera_on)
        self.menu2.addAction(self.action_camera_off)
        self.menubar.addAction(self.menu2.menuAction())

        self.retranslateUi(Face_Verification)
        QtCore.QMetaObject.connectSlotsByName(Face_Verification)

    def retranslateUi(self, Face_Verification):

        # _translate = QtCore.QCoreApplication.translate
        Face_Verification.setWindowTitle(_translate("Face_Verification", "智擎信息系统(上海)有限公司", None))
       # Face_Verification.setWindowTitle(_translate("Face_Verification", "MainWindow", None))
        self.label.setText("已登记访客")
        self.label_2.setText("未知访客")
        #self.label_3.setText("智擎信息系统")
        self.label_3.setText(_translate("Face_Verification",
                                        "<html><head/><body><p align=\"center\"><span style=\" font-size:24pt;\">智擎信息系统</span></p></body></html>",
                                        None))
        #self.menu.setTitle(_translate("Face_Verification", "信息查询", None))
        #self.menu2.setTitle(_translate("Face_Verification", "访客登记", None))
        #self.action_known.setText(_translate("Face_Verification", "已知访客", None))
        #self.action_unknown.setText(_translate("Face_Verification", "未知访客", None))

        self.menu.setTitle("系统管理")
        self.action_check.setText("信息查询")
        self.action_check.setToolTip("信息查询")
        self.action_thresh.setText("阈值设定")

        self.menu2.setTitle("摄像头管理")
        self.action_camera_on.setText("开摄像头")
        self.action_camera_off.setText("关摄像头")

        pixMap1 = QtGui.QPixmap("ID_test.jpg")
        self.ID_photo1.setScaledContents(True)
        self.ID_photo2.setScaledContents(True)
        self.ID_photo1.setPixmap(pixMap1)
        self.ID_photo1_2.setScaledContents(True)
        self.ID_photo1_3.setScaledContents(True)
        self.ID_photo1_4.setScaledContents(True)
        self.ID_photo1_5.setScaledContents(True)
        self.ID_photo1_6.setScaledContents(True)
        self.ID_photo1_7.setScaledContents(True)
        self.ID_photo3.setScaledContents(True)
        self.ID_photo4.setScaledContents(True)
        self.ID_photo5.setScaledContents(True)
        self.ID_photo6.setScaledContents(True)
        pixmap2 = QtGui.QPixmap("logo.png")
        self.logo.setScaledContents(True)
        self.logo.setPixmap(pixmap2)


    def display_id_image(self, i):# 显示已知访客照片,一次最多显示六张
        image = cv2.cvtColor(self.id_image, cv2.COLOR_BGR2RGB)
        image = QtGui.QImage(image, image.shape[1],\
                            image.shape[0], image.shape[1] * 3,QtGui.QImage.Format_RGB888)
        pix = QtGui.QPixmap(image)
        i = int(i % 6)
        if i == 0:
            self.ID_photo1.setPixmap(pix)
        if i == 1:
            self.ID_photo2.setPixmap(pix)
        if i == 2:
            self.ID_photo3.setPixmap(pix)
        if i == 3:
            self.ID_photo4.setPixmap(pix)
        if i == 4:
            self.ID_photo5.setPixmap(pix)
        if i == 5:
            self.ID_photo6.setPixmap(pix)

    def display_id_image2(self, i):  # 显示未知访客照片,一次最多显示六张

        image = cv2.cvtColor(self.id_image2, cv2.COLOR_BGR2RGB)
        image = QtGui.QImage(image, image.shape[1],\
                            image.shape[0], image.shape[1] * 3,QtGui.QImage.Format_RGB888)
        pix = QtGui.QPixmap(image)
        i = int(i % 6)
        if i == 0:
            self.ID_photo1_2.setPixmap(pix)
        if i == 1:
            self.ID_photo1_3.setPixmap(pix)
        if i == 2:
            self.ID_photo1_4.setPixmap(pix)
        if i == 3:
            self.ID_photo1_5.setPixmap(pix)
        if i == 4:
            self.ID_photo1_6.setPixmap(pix)
        if i == 5:
            self.ID_photo1_7.setPixmap(pix)

    def search_train(self):#已知访客搜索初始化 后面补充一个一天的清空时加入这个为了人员信息管理时的更新
        with open('./data/index_enter.pkl', 'rb') as f:
            self.index_dict = pkl.load(f)
        with open('./data/database_enter.npy', 'rb') as f:
            self.feature_data = np.load('./data/database_enter.npy')
        self.search_eign = Search_engin(self.feature_data)
        self.search_eign.train()

    def unknown_feature_read(self):#重启后当天的数据仍然保存(已知访客人数也在这里保存)
        self.datetime = datetime.now().strftime('%Y_%m_%d')
        self.unknownfeature_path = './data/unknown_feature.npy'
        self.unknown_pic_path = './image_saved/{}/unknown'.format(self.datetime)
        self.known_pic_path = './image_saved/{}/known'.format(self.datetime)
        if os.path.exists(self.unknownfeature_path) and os.path.exists(self.unknown_pic_path):
            try:
                self.unknownfeature = np.load(self.unknownfeature_path)
                self.unknownum = len(os.listdir(self.unknown_pic_path))
            except:
                self.unknownfeature = np.asarray([])

        else:
            self.unknownfeature = np.asarray([])
            self.unknownum = 0
        if os.path.exists(self.known_pic_path):
            self.knownum = len(os.listdir(self.known_pic_path))
        else:
            self.knownum = 0

     #当天数据清除和人数保存
    def today_clean(self, datetime): #旧日期
        number = self.unknownum + self.knownum
        with open('./image_saved/{}/number.txt'.format(datetime), 'w+') as f:
            f.write(str(number))
        if os.path.exists(self.unknownfeature_path):
            os.remove(self.unknownfeature_path)
        self.search_train()
        self.knownum = 0
        self.unknownum = 0
        self.unknownfeature = np.asarray([])

    # 识别比对
    def verify(self, thresh):
        global VIDEO_IMAGE
        global isPass
        knownflag = 0
        unknownflag = 0
        currentunknownum = 0
        currentknownum = 0
        idname = []  # 可显示id照片的编号列表
        currentDate = datetime.now().strftime('%Y_%m_%d')
        currentTime = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
        if currentDate != self.datetime: #新日期触发
            self.today_clean(self.datetime)
            self.datetime = currentDate
        web = Web_Browser()
        web.setModal(False)
        web.setWindowTitle(_translate("Face_Verification", "比对结果", None))
        # if self.pic_time != None and (datetime.datetime.now() - self.pic_time).seconds > pic_time:
            # self.image_clear()

        for i in range(probe_image.qsize()):
            image1 = probe_image.get()
        #image1 = cv2.imread('./card/2.jpg')  # 加载图片测试
        if image1 is not None:
            print('get image')
            image1 = cv2.flip(image1, 1)
            width = int(image1.shape[1] / 2)
            height = int(image1.shape[0] / 2)
            image = cv2.resize(image1.copy(), (width, height))

            try:
                    #total_start = time.time()
                    bboxs = self.naivedlib.getALLFaces(image)
                    #bbox_end = time.time()
                    print('bbox detect took ')
                    bboxs = [dlib.rectangle(int(bbox.left() * downsample_ratio), int(bbox.top() * downsample_ratio),
                                            int(bbox.right() * downsample_ratio), int(bbox.bottom() * downsample_ratio))
                             for bbox in bboxs]
                    facenum = len(bboxs)

                    #print(facenum)#人脸数
                    # index_list = []
                    #idname = []  # 可显示id照片的编号列表
                    if bboxs is not None:
                        print(time.strftime('%H:%M:%S', time.localtime(time.time())))
                        for bbox in bboxs:
                            # 对每个人脸进行操作
                            print('bbox is detected')
                            query = []
                            left_eye, right_eye = self.naivedlib.get_eyes(image1, bbox)
                            start = time.time()
                            save_croped, crop_image = crop_rotate_part(image1[:, :, ::-1], bbox, left_eye, right_eye,
                                                                       bbox.width() * 0.895)
                            save_croped = cv2.cvtColor(save_croped, cv2.COLOR_BGR2RGB)

                            # bbox_temp = [bbox.left(),bbox.top(),bbox.right(),bbox.bottom()]
                            # crop_image = crop_only(image1,bbox_temp)
                            # cv2.imwrite('image.jpg',crop_image)
                            end = time.time()
                            print('\tpreprocess took {}'.format(end - start))

                            flip_image = cv2.flip(crop_image.copy(), 1)
                            crop_image = proc_img(crop_image, is_whiten=False)
                            flip_image = proc_img(flip_image, is_whiten=False)
                            query.append(crop_image[0])
                            query.append(flip_image[0])
                            prob_image = np.asarray(query)

                            start = time.time()
                            feature = self.extractor.extract_feature(prob_image)
                            end = time.time()
                            print('\textract feature took {}'.format(end - start))
                            feature = feature / np.linalg.norm(feature)
                            idx_list = self.search_eign.search(feature)  # 获取搜索后的排列
                            idx_list = [idx_list[0][i] for i in range(idx_list.shape[1])]
                            score_list = []
                            name_list = []
                            for idx in idx_list:
                                score = 1 - spatial.distance.cosine(feature, self.feature_data[int(idx)])
                                name = {value: key for key, value in self.index_dict.items()}[int(idx)]
                                score_list.append(score)
                                name_list.append(name)
                            print(name_list)
                            print(score_list)
                            #person_list = [name.split('_')[0] for name in name_list]
                            #person_set = list(set(person_list))
                            #person_num = len(person_set)
                            #print(person_num)

                            score = 1 - spatial.distance.cosine(feature, self.feature_data[int(idx_list[0])])
                            thresh = float(thresh)
                            print(thresh)
                            if score > thresh:
                                knownflag = 1
                                name = name_list[0]
                                if self.knownum == 0:
                                    self.knownum = 1
                                    if not os.path.exists('./image_saved/{}'.format(currentDate)):
                                        os.mkdir('./image_saved/{}'.format(currentDate))
                                        os.mkdir('./image_saved/{}/unknown'.format(currentDate))
                                        os.mkdir('./image_saved/{}/known'.format(currentDate))
                                    cv2.imwrite('./image_saved/{}/known/{}_{}.jpg'.format(currentDate, currentTime,
                                                                                            name),
                                                save_croped)
                                    idname.append(name) #当前帧中的已知访客name
                                    print("欢迎" + name)
                                    print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
                                else:
                                    img_list = os.listdir(self.known_pic_path)  # 返回指定的文件夹包含的文件或文件夹的名字的列表
                                    knownlist = [item.split('.')[0] for item in img_list]
                                    knownlist = [item.split('_')[1] for item in knownlist]
                                    if name not in knownlist:
                                        cv2.imwrite('./image_saved/{}/known/{}_{}.jpg'.format(currentDate, currentTime,
                                                                                            name),
                                                save_croped)
                                        idname.append(name) #当前帧中的已知访客name
                                        self.knownum = self.knownum + 1
                                        print("欢迎" + name)
                                        print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))

                            else:
                                unknownflag = 1
                                if self.unknownum == 0:
                                    print("第一个未知人员")
                                    currentunknownum = currentunknownum + 1
                                    self.unknownum = 1
                                    #self.unknownlist[self.unknownum] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                                    if not os.path.exists('./image_saved/{}'.format(currentDate)):
                                        os.mkdir('./image_saved/{}'.format(currentDate))
                                        os.mkdir('./image_saved/{}/unknown'.format(currentDate))
                                        os.mkdir('./image_saved/{}/known'.format(currentDate))

                                    cv2.imwrite('./image_saved/{}/unknown/{}_{}.jpg'.format(currentDate, currentTime,
                                                                                        self.unknownum),save_croped)
                                    self.unknownfeature = feature[np.newaxis, :]

                                else:
                                    unthresh = 0.6
                                    self.search_eign_unknown = Search_engin(self.unknownfeature)  # 未知访客搜索
                                    self.search_eign_unknown.train()
                                    unknown_idx = self.search_eign_unknown.search(feature)
                                    unknown_idx = [unknown_idx[0][i] for i in range(unknown_idx.shape[1])]
                                    print(unknown_idx)
                                    uscore = 1 - spatial.distance.cosine(feature, self.unknownfeature[int(unknown_idx[0])])
                                    print(uscore)
                                    if uscore < unthresh: # 当天第一次识别出该未知人员
                                        self.unknownum = self.unknownum + 1
                                        currentunknownum = currentunknownum + 1
                                        #self.unknownlist[self.unknownum] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                                        cv2.imwrite('./image_saved/{}/unknown/{}_{}.jpg'.format(currentDate, currentTime,
                                                                                    self.unknownum), save_croped)
                                        self.unknownfeature = np.vstack((self.unknownfeature, feature))
                                        #print("第二个")
                                        #print(time.strftime('%H:%M:%S', time.localtime(time.time())))

                        if knownflag == 1:
                            #print(idname)
                            currentknownum = len(idname)  # 当前帧已知访客数量
                            #self.knownum = self.knownum + currentknownum
                            for i in range(currentknownum):
                                self.id_image = cv2.imread('./user_pic/{}.bmp'.format(idname[i]))
                                self.display_id_image(self.knownum)
                        if unknownflag == 1:
                            print("未知人总数:{}".format(self.unknownum))
                           # print("当前帧未知人数:{}".format(currentunknownum))
                            with open(self.unknownfeature_path, 'wb') as f:
                                self.unknownfeature = np.asarray(self.unknownfeature)
                                np.save(f, self.unknownfeature)
                            for i in range(currentunknownum):
                                self.id_image2 = cv2.imread('./image_saved/{}/unknown/{}_{}.jpg'.format(currentDate, currentTime, self.unknownum))
                                self.display_id_image2(self.unknownum)

                        #print(time.strftime('%H:%M:%S', time.localtime(time.time())))
                    else:

                        web.write_result("未检测到人脸", 'red')
                        web.exec_()

            except:
                    pass
        else:
            pass

    def display_probe_image(self):

        #ret, image1 = self.video_capture.read()
        if VIDEO_IMAGE.qsize() != 0:
            for i in range(VIDEO_IMAGE.qsize()):
                image1 = VIDEO_IMAGE.get()
                probe_image.put(image1)
            self.probe_image = image1.copy()

            try:
                #bbox = self.naivedlib.getLargestFaceBoundingBox(image1)
                bboxs = self.naivedlib.getALLFaces(image1)
                image1 = self.naivedlib.drawbboxs(image1, bboxs)

            except:
                pass
            image = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)
            image = cv2.resize(image, (320 * 2, 240 * 2))
            # image = cv2.flip(image,1)
            image = QtGui.QImage(image, image.shape[1], \
                                 image.shape[0], image.shape[1] * 3, QtGui.QImage.Format_RGB888)
            pix = QtGui.QPixmap.fromImage(image)
            self.Probe_photo.setPixmap(pix)
        else:
            self.probe_image = None
            self.Probe_photo.setText(_translate("Face_Verification", "未读取到图片", None))
            self.Probe_photo.setStyleSheet('color: red')


    def start(self):
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.display_probe_image)

        self.timer.start(1000./24)


    def start_verify(self):
        self.timer3= QtCore.QTimer()
        global thresh
        self.timer3.timeout.connect(lambda: self.verify(thresh))
        self.timer3.start(1000)#1000ms==1s进行一次识别