1.进程detect_process:
读取视频或者摄像头,使用yolov5进行检测人体位置,然后根据人体位置进行检测人脸,并识别,并将检测到的人脸信息放入 多进程队列 result_queue 中。
放入 多进程队列 result_queue 数据格式
send_data = { 'image': base64.b64encode(img_bytes).decode('utf-8'), 'name': 'cuijiayu', 'time': str(datetime.datetime.now()), 'address': '置地大厦23层'}
def detect(mycap, f, total_num, yolo5_config, face_args, face_app, Model,
class_names, deepsort_tracker, Obj_Counter, result_queue):
fps_time = time.time()
while mycap.ifcontinue():
f += 1
if len(yolo5_config.input) <= 1:
# 从摄像头读入
ret, img, name = mycap.read()
else:
# 从本地视频读入
ret, img = mycap.read()
if ret:
# 开始检测图片中的人
"""
isCountPresent:
True:表示只显示当前人数
False:表示显示总人数和当前人数
"""
# Counting_Processing 函数封装了 yolov5检测,deepsort跟踪计数函数
result_img = Counting_Processing(img, yolo5_config, face_args, face_app, Model, class_names, deepsort_tracker, Obj_Counter, result_queue, isCountPresent = False)
result_img = imutils.resize(result_img, height=600)
result_img = cv2.putText(result_img, '%d, FPS: %f' % (f, 1.0 / (time.time() - fps_time)),
(50, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
fps_time = time.time()
cv2.imshow('video', result_img)
cv2.waitKey(1)
if cv2.getWindowProperty('video', cv2.WND_PROP_AUTOSIZE) < 1:
# 点x退出
break
sys.stdout.write("\r=> processing at %d; total: %d\n" % (mycap.get_index(), total_num))
sys.stdout.flush()
print("\n=> 总检测人数:", len(Global.total_person))
cv2.destroyAllWindows()
mycap.release()
print("=> 任务结束于: {}".format(datetime.now().strftime('%H:%M:%S')))
2.进程send_process:
不断的从 多进程队列 result_queue 读取检测数据,并添加信息头 message = detect_data,然后发送给服务器。
发送数据格式
send_data = { "message": 'detect_data', 'image': base64.b64encode(img_bytes).decode('utf-8'), 'name': 'cuijiayu', 'time': str(datetime.datetime.now()), 'address': '置地大厦23层'}
def send_face_data(client_socket, result_queue):
"""
不断的从 队列result_queue 读取数据并且发送, 模型检测
Args:
client_socket: 客户端连接器
result_queue: 多进程队列
发送数据:图片,姓名,时间,地点
"""
# 发送消息给服务器, 告知将要发送 检测信息
while True:
while not result_queue.empty():
face_detect_data = result_queue.get()
face_detect_data['message'] = 'detect_data'
json_data = json.dumps(face_detect_data)
# 将JSON字符串编码为字节
send_receive(client_socket, json_data)