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)
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进行一次识别