From 9618bbc526cd62ef08999a2ee81fa688e54770fa Mon Sep 17 00:00:00 2001 From: zhoushuliang Date: Thu, 10 Jul 2025 17:14:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20concurrency/PushVideoStrea?= =?UTF-8?q?mProcess.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- concurrency/PushVideoStreamProcess.py | 139 +++++++++++++++++--------- 1 file changed, 93 insertions(+), 46 deletions(-) diff --git a/concurrency/PushVideoStreamProcess.py b/concurrency/PushVideoStreamProcess.py index d10841c..39acd89 100644 --- a/concurrency/PushVideoStreamProcess.py +++ b/concurrency/PushVideoStreamProcess.py @@ -23,7 +23,7 @@ from util.Cv2Utils import video_conjuncing, write_or_video, write_ai_video, push from util.ImageUtils import url2Array, add_water_pic from util.LogUtils import init_log -from util.PlotsUtils import draw_painting_joint, filterBox, xywh2xyxy2, draw_name_joint +from util.PlotsUtils import draw_painting_joint, filterBox, xywh2xyxy2, xy2xyxy, draw_name_joint, plot_one_box_auto, draw_name_ocr,draw_name_crowd from util.QueUtil import get_no_block_queue, put_queue, clear_queue @@ -37,7 +37,7 @@ class PushStreamProcess(Process): self._msg, self._push_queue, self._image_queue, self._push_ex_queue, self._hb_queue, self._context = args self._algStatus = False # 默认关闭 self._algSwitch = self._context['service']['algSwitch'] - + #0521: default_enabled = str(self._msg.get("defaultEnabled", "True")).lower() == "true" @@ -49,16 +49,9 @@ class PushStreamProcess(Process): print("执行替代程序(defaultEnabled=False)") # 这里放非默认逻辑的代码 self._algSwitch = False - - + print("---line53 :PushVideoStreamProcess.py---",self._algSwitch) - - - - - - - + def build_logo_url(self): logo = None if self._context["video"]["video_add_water"]: @@ -155,17 +148,39 @@ class OnPushStreamProcess(PushStreamProcess): font_config, allowedList = draw_config["font_config"], draw_config[code]["allowedList"] rainbows, label_arrays = draw_config[code]["rainbows"], draw_config[code]["label_arrays"] for qs in det_result: - try: # 应对NaN情况 - box, score, cls = xywh2xyxy2(qs) - except: - continue - if cls not in allowedList or score < frame_score: - continue - label_array, color = label_arrays[cls], rainbows[cls] - if ModelType.CHANNEL2_MODEL.value[1] == str(code) and cls == 2: - rr = t.submit(draw_name_joint, box, copy_frame, draw_config[code]["label_dict"], score, color, font_config, qs[6]) + # 自研车牌模型处理 + if ModelType.CITY_CARPLATE_MODEL.value[1] == str(code): + cls = 0 + ocrlabel, xybox = qs + box = xy2xyxy(xybox) + score = None + color = rainbows[cls] + label_array = None + rr = t.submit(draw_name_ocr, xybox, copy_frame, color, ocrlabel) + elif ModelType.CITY_DENSECROWDCOUNT_MODEL.value[1] == str(code): + cls = 0 + crowdlabel, points = qs + box = [(0, 0), (0, 0), (0, 0), (0, 0)] + score = None + color = rainbows[cls] + label_array = None + rr = t.submit(draw_name_crowd, points, copy_frame, color, crowdlabel) else: - rr = t.submit(draw_painting_joint, box, copy_frame, label_array, score, color, font_config) + try: # 应对NaN情况 + box, score, cls = xywh2xyxy2(qs) + except: + continue + if cls not in allowedList or score < frame_score: + continue + label_array, color = label_arrays[cls], rainbows[cls] + if ModelType.CHANNEL2_MODEL.value[1] == str(code) and cls == 2: + rr = t.submit(draw_name_joint, box, copy_frame, + draw_config[code]["label_dict"], score, color, + font_config, qs[6]) + else: + rr = t.submit(draw_painting_joint, box, copy_frame, label_array, + score, color, font_config) + thread_p.append(rr) if det_xywh.get(code) is None: det_xywh[code] = {} @@ -184,17 +199,17 @@ class OnPushStreamProcess(PushStreamProcess): box[2][0], box[2][1], box[3][0], box[3][1], score, cls, code],dtype=np.float32) qs_np = np.row_stack((qs_np, result_li)) - + if logo: frame = add_water_pic(frame, logo, request_id) copy_frame = add_water_pic(copy_frame, logo, request_id) if len(thread_p) > 0: for r in thread_p: r.result() - #print('----line173:',self._algSwitch,self._algStatus) + #print('----line173:',self._algSwitch,self._algStatus) if self._algSwitch and (not self._algStatus): frame_merge = video_conjuncing(frame, frame.copy()) - else: + else: frame_merge = video_conjuncing(frame, copy_frame) # 写原视频到本地 write_or_video_result = t.submit(write_or_video, frame, orFilePath, or_video_file, @@ -207,7 +222,7 @@ class OnPushStreamProcess(PushStreamProcess): # 如果有问题, 走下面的逻辑 if qs_np is not None: if len(qs_np.shape) == 1: - qs_np = qs_np[np.newaxis,...] + qs_np = qs_np[np.newaxis,...] qs_np_id = qs_np.copy() b = np.ones(qs_np_id.shape[0]) qs_np_id = np.column_stack((qs_np_id,b)) @@ -233,7 +248,7 @@ class OnPushStreamProcess(PushStreamProcess): if q[11] >= 1: cls = int(q[9]) if not (cls in new_lab): - continue # 为了防止其他类别被带出 + continue # 为了防止其他类别被带出 code = str(int(q[10])).zfill(3) if det_xywh2.get(code) is None: det_xywh2[code] = {} @@ -246,6 +261,11 @@ class OnPushStreamProcess(PushStreamProcess): is_new = False if q[11] == 1: is_new = True + if ModelType.CITY_CARPLATE_MODEL.value[1] == str(code): + cls = ocrlabel + elif ModelType.CITY_DENSECROWDCOUNT_MODEL.value[1] == str(code): + cls = crowdlabel + label_array = points if cd is None: det_xywh2[code][cls] = [[cls, box, score, label_array, color, is_new]] else: @@ -268,7 +288,7 @@ class OnPushStreamProcess(PushStreamProcess): ex_status = False logger.info("停止推流进程, requestId: {}", request_id) break - + del push_r else: sleep(1) @@ -363,24 +383,45 @@ class OffPushStreamProcess(PushStreamProcess): qs_reurn = [] for det in push_objs[i]: code, det_result = det - + # 每个单独模型处理 # 模型编号、100帧的所有问题, 检测目标、颜色、文字图片 if len(det_result) > 0: font_config, allowedList = draw_config["font_config"], draw_config[code]["allowedList"] rainbows, label_arrays = draw_config[code]["rainbows"], draw_config[code]["label_arrays"] for qs in det_result: - box, score, cls = xywh2xyxy2(qs) - - if cls not in allowedList or score < frame_score: - continue - label_array, color = label_arrays[cls], rainbows[cls] - if ModelType.CHANNEL2_MODEL.value[1] == str(code) and cls == 2: - rr = t.submit(draw_name_joint, box, copy_frame, draw_config[code]["label_dict"], score, color, font_config, qs[6]) + # 自研车牌模型处理 + if ModelType.CITY_CARPLATE_MODEL.value[1] == str(code): + cls = 0 + ocrlabel, xybox = qs + box = xy2xyxy(xybox) + score = None + color = rainbows[cls] + label_array = None + label_arrays = [None] + rr = t.submit(draw_name_ocr,xybox,copy_frame,color,ocrlabel) + + elif ModelType.CITY_DENSECROWDCOUNT_MODEL.value[1] == str(code): + cls = 0 + crowdlabel, points = qs + box = [(0,0),(0,0),(0,0),(0,0)] + score = None + color = rainbows[cls] + label_array = None + rr = t.submit(draw_name_crowd, points, copy_frame, color, crowdlabel) + else: - rr = t.submit(draw_painting_joint, box, copy_frame, label_array, score, color, font_config) + box, score, cls = xywh2xyxy2(qs) + if cls not in allowedList or score < frame_score: + continue + label_array, color = label_arrays[cls], rainbows[cls] + if ModelType.CHANNEL2_MODEL.value[1] == str(code) and cls == 2: + rr = t.submit(draw_name_joint, box, copy_frame, draw_config[code]["label_dict"], score, color, font_config, qs[6]) + else: + rr = t.submit(draw_painting_joint, box, copy_frame, label_array, score, color, font_config) + thread_p.append(rr) - + if det_xywh.get(code) is None: det_xywh[code] = {} cd = det_xywh[code].get(cls) @@ -388,17 +429,17 @@ class OffPushStreamProcess(PushStreamProcess): if cd is None: det_xywh[code][cls] = [[cls, box, score, label_array, color]] else: - det_xywh[code][cls].append([cls, box, score, label_array, color]) + det_xywh[code][cls].append([cls, box, score, label_array, color]) if qs_np is None: - qs_np = np.array([box[0][0], box[0][1], box[1][0], box[1][1], - box[2][0], box[2][1], box[3][0], box[3][1], + qs_np = np.array([box[0][0], box[0][1], box[1][0], box[1][1], + box[2][0], box[2][1], box[3][0], box[3][1], score, cls, code],dtype=np.float32) else: - result_li = np.array([box[0][0], box[0][1], box[1][0], box[1][1], + result_li = np.array([box[0][0], box[0][1], box[1][0], box[1][1], box[2][0], box[2][1], box[3][0], box[3][1], score, cls, code],dtype=np.float32) qs_np = np.row_stack((qs_np, result_li)) - + if logo: frame = add_water_pic(frame, logo, request_id) copy_frame = add_water_pic(copy_frame, logo, request_id) @@ -407,7 +448,7 @@ class OffPushStreamProcess(PushStreamProcess): r.result() if self._algSwitch and (not self._algStatus): frame_merge = video_conjuncing(frame, frame.copy()) - else: + else: frame_merge = video_conjuncing(frame, copy_frame) # 写识别视频到本地 write_ai_video_result = t.submit(write_ai_video, frame_merge, aiFilePath, @@ -416,10 +457,9 @@ class OffPushStreamProcess(PushStreamProcess): push_stream_result = t.submit(push_video_stream, frame_merge, push_p, push_url, p_push_status, request_id) - if qs_np is not None: if len(qs_np.shape) == 1: - qs_np = qs_np[np.newaxis,...] + qs_np = qs_np[np.newaxis,...] qs_np_id = qs_np.copy() b = np.ones(qs_np_id.shape[0]) qs_np_id = np.column_stack((qs_np_id,b)) @@ -446,7 +486,7 @@ class OffPushStreamProcess(PushStreamProcess): if q[11] >= 1: cls = int(q[9]) if not (cls in new_lab): - continue # 为了防止其他类别被带出 + continue # 为了防止其他类别被带出 code = str(int(q[10])).zfill(3) if det_xywh2.get(code) is None: det_xywh2[code] = {} @@ -459,6 +499,13 @@ class OffPushStreamProcess(PushStreamProcess): is_new = False if q[11] == 1: is_new = True + + if ModelType.CITY_CARPLATE_MODEL.value[1] == str(code): + cls = ocrlabel + elif ModelType.CITY_DENSECROWDCOUNT_MODEL.value[1] == str(code): + cls = crowdlabel + label_array = points + if cd is None: det_xywh2[code][cls] = [[cls, box, score, label_array, color, is_new]] else: