From c0079fc9f569738d1252eb1a36ab1f629d82b0ea Mon Sep 17 00:00:00 2001 From: th Date: Sat, 15 Mar 2025 14:04:26 +0800 Subject: [PATCH] mqtt data format --- concurrency/FileUploadThread.py | 49 ++++-- concurrency/IntelligentRecognitionProcess.py | 49 +++++- concurrency/PullVideoStreamProcess.py | 8 + concurrency/PushVideoStreamProcess.py | 25 ++- .../FileUploadThread.cpython-38.pyc | Bin 8299 -> 9184 bytes ...telligentRecognitionProcess.cpython-38.pyc | Bin 36658 -> 37596 bytes .../PullVideoStreamProcess.cpython-38.pyc | Bin 10360 -> 10595 bytes .../PushVideoStreamProcess.cpython-38.pyc | Bin 11774 -> 12382 bytes config/mqtt/dsp_test_mqtt.yml | 10 +- config/service/dsp_test_service.yml | 2 + entity/FeedBack.py | 6 +- entity/__pycache__/FeedBack.cpython-38.pyc | Bin 1343 -> 1409 bytes enums/ModelTypeEnum.py | 63 ++++++- .../__pycache__/ModelTypeEnum.cpython-38.pyc | Bin 15510 -> 16924 bytes readme.md | 2 + service/Dispatcher.py | 24 ++- service/__pycache__/Dispatcher.cpython-38.pyc | Bin 15758 -> 16407 bytes util/LocationUtils.py | 156 ++++++++++++++++++ util/ModelUtils.py | 26 +++ util/__pycache__/LocationUtils.cpython-38.pyc | Bin 0 -> 5203 bytes util/__pycache__/LogUtils.cpython-38.pyc | Bin 945 -> 945 bytes util/__pycache__/MinioSdk.cpython-38.pyc | Bin 3711 -> 3672 bytes util/__pycache__/ModelUtils.cpython-38.pyc | Bin 21964 -> 23165 bytes 23 files changed, 388 insertions(+), 32 deletions(-) create mode 100644 util/LocationUtils.py create mode 100644 util/__pycache__/LocationUtils.cpython-38.pyc diff --git a/concurrency/FileUploadThread.py b/concurrency/FileUploadThread.py index 6147ce7..069f921 100644 --- a/concurrency/FileUploadThread.py +++ b/concurrency/FileUploadThread.py @@ -16,6 +16,7 @@ from enums.AnalysisStatusEnum import AnalysisStatus from util.PlotsUtils import draw_painting_joint from util.QueUtil import put_queue, get_no_block_queue, clear_queue import io +from util.LocationUtils import locate_byMqtt class FileUpload(Thread): __slots__ = ('_fb_queue', '_context', '_image_queue', '_analyse_type', '_msg','_mqtt_list') @@ -24,7 +25,9 @@ class FileUpload(Thread): super().__init__() self._fb_queue, self._context, self._msg, self._image_queue, self._analyse_type,self._mqtt_list = args self._storage_source = self._context['service']['storage_source'] - + self._algStatus = False # 默认关闭 + self._algSwitch = self._context['service']['algSwitch'] +#如果任务是在线、离线处理,则用此类 class ImageFileUpload(FileUpload): __slots__ = () @@ -36,15 +39,14 @@ class ImageFileUpload(FileUpload): ''' det_xywh:{ 'code':{ - 1: [[detect_targets_code, box, score, label_array, color]] + 1: [[detect_targets_code, box, score, label_array, color,is_new]] } - } + } #is_new--是否是新的目标。 模型编号:modeCode 检测目标:detectTargetCode ''' - #print('*'*100,' mqtt_list:',len(self._mqtt_list)) - #if len(self._mqtt_list)>=10: - # print(' mqtt[4]:',self._mqtt_list[0]['satcount']) + print('*'*100,' mqtt_list:',len(self._mqtt_list)) + model_info = [] # 更加模型编码解析数据 @@ -55,7 +57,14 @@ class ImageFileUpload(FileUpload): aFrame = frame.copy() for target in target_list: draw_painting_joint(target[1], aFrame, target[3], target[2], target[4], font_config, target[5]) - model_info.append({"modelCode": str(code), "detectTargetCode": str(cls), "aFrame": aFrame}) + igH,igW = aFrame.shape[0:2] + if len(self._mqtt_list)>=1: + #camParas = self._mqtt_list[0]['data'] + camParas = self._mqtt_list[0] + gps = locate_byMqtt(target[1],igW,igH,camParas,outFormat='wgs84') + else: + gps=[None,None] + model_info.append({"modelCode": str(code), "detectTargetCode": str(cls), "aFrame": aFrame,'gps':gps}) if len(model_info) > 0: image_result = { "or_frame": frame, @@ -74,6 +83,8 @@ class ImageFileUpload(FileUpload): image_queue, fb_queue, analyse_type = self._image_queue, self._fb_queue, self._analyse_type service_timeout = int(service["timeout"]) frame_step = int(service["filter"]["frame_step"]) + 120 + if msg['taskType']==0: self._algStatus = False + else: self._algStatus = True try: with ThreadPoolExecutor(max_workers=2) as t: # 初始化oss客户端 @@ -92,10 +103,15 @@ class ImageFileUpload(FileUpload): # 获取队列中的消息 image_msg = get_no_block_queue(image_queue) if image_msg is not None: + if image_msg[0] == 2: + logger.info("图片上传线程收到命令:{}, requestId: {}",image_msg[1] ,request_id) if 'stop' == image_msg[1]: logger.info("开始停止图片上传线程, requestId:{}", request_id) break + if 'algStart' == image_msg[1]: self._algStatus = True; logger.info("图片上传线程,执行算法开启命令, requestId:{}", request_id) + if 'algStop' == image_msg[1]: self._algStatus = False; logger.info("图片上传线程,执行算法关闭命令, requestId:{}", request_id) + if image_msg[0] == 1: image_result = self.handle_image(image_msg[1], frame_step) if image_result is not None: @@ -147,10 +163,14 @@ class ImageFileUpload(FileUpload): remote_image_list[0], remote_image_list[ii+1], model_info['modelCode'], - model_info['detectTargetCode']) ) - - for msg in msg_list: - put_queue(fb_queue, msg, timeout=2, is_ex=False) + model_info['detectTargetCode'], + longitude=model_info['gps'][0], + latitude=model_info['gps'][1], + ) ) + + if (not self._algSwitch) or ( self._algStatus and self._algSwitch): + for msg in msg_list: + put_queue(fb_queue, msg, timeout=2, is_ex=False) del task, msg_list else: sleep(1) @@ -175,7 +195,7 @@ def build_image_name(*args): random_num, mode_type, modeCode, target, image_type) - +#如果任务是图像处理,则用此类 class ImageTypeImageFileUpload(Thread): __slots__ = ('_fb_queue', '_context', '_image_queue', '_analyse_type', '_msg') @@ -271,6 +291,7 @@ class ImageTypeImageFileUpload(Thread): else: image_result = self.handle_image(det_xywh, copy_frame, font_config) if image_result: + # 图片帧数编码 if image_url is None: or_result, or_image = cv2.imencode(".jpg", image_result.get("or_frame")) @@ -345,8 +366,8 @@ class ImageTypeImageFileUpload(Thread): analyse_type, "", "", "", image_url, remote_url_list[ii], - model_info.get('modelCode'), - model_info.get('detectTargetCode'), + model_info_list[ii].get('modelCode'), + model_info_list[ii].get('detectTargetCode'), analyse_results=result)) diff --git a/concurrency/IntelligentRecognitionProcess.py b/concurrency/IntelligentRecognitionProcess.py index 6a94672..7c40632 100644 --- a/concurrency/IntelligentRecognitionProcess.py +++ b/concurrency/IntelligentRecognitionProcess.py @@ -5,7 +5,7 @@ from concurrent.futures import ThreadPoolExecutor from os.path import join, exists, getsize from time import time, sleep from traceback import format_exc - +import requests import cv2 from multiprocessing import Process, Queue @@ -63,7 +63,7 @@ class IntelligentRecognitionProcess(Process): put_queue(self._fb_queue, message_feedback(self._msg["request_id"], AnalysisStatus.WAITING.value, self._analyse_type, progress=init_progess), timeout=2, is_ex=True) self._storage_source = self._context['service']['storage_source'] - + self._algStatus = False def sendEvent(self, eBody): put_queue(self.event_queue, eBody, timeout=2, is_ex=True) @@ -276,7 +276,12 @@ class OnlineIntelligentRecognitionProcess(IntelligentRecognitionProcess): if event_result: cmdStr = event_result.get("command") - + #接收到算法开启、或者关闭的命令 + if cmdStr in ['algStart' , 'algStop' ]: + logger.info("发送向推流进程发送算法命令, requestId: {}, {}", request_id,cmdStr ) + put_queue(push_queue, (2, cmdStr), timeout=1, is_ex=True) + pull_process.sendCommand({"command": cmdStr}) + # 接收到停止指令 if "stop" == cmdStr: logger.info("实时任务开始停止, requestId: {}", request_id) @@ -593,6 +598,11 @@ class OfflineIntelligentRecognitionProcess(IntelligentRecognitionProcess): if "stop" == cmdStr: logger.info("离线任务开始停止, requestId: {}", request_id) pull_process.sendCommand({"command": 'stop'}) + if cmdStr in ['algStart' , 'algStop' ]: + logger.info("发送向推流进程发送算法命令, requestId: {}, {}", request_id,cmdStr ) + put_queue(push_queue, (2, cmdStr), timeout=1, is_ex=True) + pull_process.sendCommand({"command": cmdStr}) + pull_result = get_no_block_queue(pull_queue) if pull_result is None: sleep(1) @@ -1104,16 +1114,43 @@ class PhotosIntelligentRecognitionProcess(Process): image_thread.setDaemon(True) image_thread.start() return image_thread - + def check_ImageUrl_Vaild(self,url,timeout=1): + try: + # 发送 HTTP 请求,尝试访问图片 + response = requests.get(url, timeout=timeout) # 设置超时时间为 10 秒 + if response.status_code == 200: + return True,url + else: + return False,f"图片地址无效,状态码:{response.status_code}" + except requests.exceptions.RequestException as e: + # 捕获请求过程中可能出现的异常(如网络问题、超时等) + return False,str(e) + def run(self): fb_queue, msg, analyse_type, context = self._fb_queue, self._msg, self._analyse_type, self._context request_id, logo, image_queue = msg["request_id"], context['logo'], self._image_queue base_dir, env = context["base_dir"], context["env"] imageUrls = msg["image_urls"] image_thread = None - with ThreadPoolExecutor(max_workers=2) as t: + init_log(base_dir, env) + valFlag=True + for url in imageUrls: + valFlag,ret = self.check_ImageUrl_Vaild(url,timeout=1) + + if not valFlag: + logger.error("图片分析异常: {}, requestId:{},url:{}",ret, request_id,url) + #print("AnalysisStatus.FAILED.value:{},ExceptionType.URL_ADDRESS_ACCESS_FAILED.value[0]:{},ExceptionType.URL_ADDRESS_ACCESS_FAILED.value[1]:{}".format(AnalysisStatus.FAILED.value,ExceptionType.URL_ADDRESS_ACCESS_FAILED.value[0],ExceptionType.URL_ADDRESS_ACCESS_FAILED.value[1] ) ) + put_queue(fb_queue, message_feedback(request_id, AnalysisStatus.FAILED.value, + analyse_type, + ExceptionType.URL_ADDRESS_ACCESS_FAILED.value[0], + ExceptionType.URL_ADDRESS_ACCESS_FAILED.value[1]), timeout=2) + + return + + + with ThreadPoolExecutor(max_workers=1) as t: try: - init_log(base_dir, env) + #init_log(base_dir, env) logger.info("开始启动图片识别进程, requestId: {}", request_id) model_array = get_model(msg, context, analyse_type) image_thread = self.start_File_upload(fb_queue, context, msg, image_queue, analyse_type) diff --git a/concurrency/PullVideoStreamProcess.py b/concurrency/PullVideoStreamProcess.py index d87c779..54fe030 100644 --- a/concurrency/PullVideoStreamProcess.py +++ b/concurrency/PullVideoStreamProcess.py @@ -102,6 +102,10 @@ class OnlinePullVideoStreamProcess(PullVideoStreamProcess): logger.info("开始停止实时拉流进程, requestId:{}", request_id) ex_status = False break + if command_msg.get("command") in ['algStart' , 'algStop' ]: + logger.info("拉流进程中,requestId:{},向图片上传进程发送命令:{}", request_id,command_msg.get("command")) + put_queue(image_queue, (2, command_msg.get("command") ), timeout=1) + # 检测视频信息是否存在或拉流对象是否存在 if check_video_stream(width, height): if len(frame_list) > 0: @@ -249,6 +253,10 @@ class OfflinePullVideoStreamProcess(PullVideoStreamProcess): logger.info("开始停止离线拉流进程, requestId:{}", request_id) ex_status = False break + if command_msg.get("command") in ['algStart' , 'algStop' ]: + logger.info("拉流进程中,requestId:{},向图片上传进程发送命令:{}", request_id,command_msg.get("command")) + put_queue(image_queue, (2, command_msg.get("command") ), timeout=1) + # 检测视频信息是否存在或拉流对象是否存在 if check_video_stream(width, height): logger.info("开始重新获取视频信息: {}次, requestId: {}", cv2_init_num, request_id) diff --git a/concurrency/PushVideoStreamProcess.py b/concurrency/PushVideoStreamProcess.py index 6a5850a..6788d61 100644 --- a/concurrency/PushVideoStreamProcess.py +++ b/concurrency/PushVideoStreamProcess.py @@ -35,7 +35,9 @@ class PushStreamProcess(Process): super().__init__() # 传参 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'] + def build_logo_url(self): logo = None if self._context["video"]["video_add_water"]: @@ -168,7 +170,11 @@ class OnPushStreamProcess(PushStreamProcess): if len(thread_p) > 0: for r in thread_p: r.result() - frame_merge = video_conjuncing(frame, copy_frame) + #print('----line173:',self._algSwitch,self._algStatus) + if self._algSwitch and (not self._algStatus): + frame_merge = video_conjuncing(frame, frame.copy()) + else: + frame_merge = video_conjuncing(frame, copy_frame) # 写原视频到本地 write_or_video_result = t.submit(write_or_video, frame, orFilePath, or_video_file, or_write_status, request_id) @@ -231,6 +237,9 @@ class OnPushStreamProcess(PushStreamProcess): or_video_file = write_or_video_result.result(timeout=60) # 接收停止指令 if push_r[0] == 2: + logger.info("拉流进程收到控制命令为:{}, requestId: {}",push_r[1] ,request_id) + if 'algStart' == push_r[1]: self._algStatus = True;logger.info("算法识别开启, requestId: {}", request_id) + if 'algStop' == push_r[1]: self._algStatus = False;logger.info("算法识别关闭, requestId: {}", request_id) if 'stop' == push_r[1]: logger.info("停止推流进程, requestId: {}", request_id) break @@ -238,6 +247,7 @@ class OnPushStreamProcess(PushStreamProcess): ex_status = False logger.info("停止推流进程, requestId: {}", request_id) break + del push_r else: sleep(1) @@ -286,6 +296,8 @@ class OffPushStreamProcess(PushStreamProcess): picture_similarity = bool(context["service"]["filter"]["picture_similarity"]) qs_np_tmp = None pix_dis = 60 + if msg['taskType']==0: self._algStatus = False + else: self._algStatus = True try: init_log(base_dir, env) logger.info("开始启动离线推流进程!requestId:{}", request_id) @@ -372,7 +384,11 @@ class OffPushStreamProcess(PushStreamProcess): if len(thread_p) > 0: for r in thread_p: r.result() - frame_merge = video_conjuncing(frame, copy_frame) + print('----line384:',self._algSwitch,self._algStatus) + if self._algSwitch and (not self._algStatus): + frame_merge = video_conjuncing(frame, frame.copy()) + else: + frame_merge = video_conjuncing(frame, copy_frame) # 写识别视频到本地 write_ai_video_result = t.submit(write_ai_video, frame_merge, aiFilePath, ai_video_file, @@ -433,6 +449,9 @@ class OffPushStreamProcess(PushStreamProcess): ai_video_file = write_ai_video_result.result(timeout=60) # 接收停止指令 if push_r[0] == 2: + logger.info("拉流进程收到控制命令为:{}, requestId: {}",push_r[1] ,request_id) + if 'algStart' == push_r[1]: self._algStatus = True;logger.info("算法识别开启, requestId: {}", request_id) + if 'algStop' == push_r[1]: self._algStatus = False;logger.info("算法识别关闭, requestId: {}", request_id) if 'stop' == push_r[1]: logger.info("停止推流进程, requestId: {}", request_id) break diff --git a/concurrency/__pycache__/FileUploadThread.cpython-38.pyc b/concurrency/__pycache__/FileUploadThread.cpython-38.pyc index 00084893db2f3cf21a329994ba993bd77c689bdc..e00f621391a7f4473bba521a4ba2776849b87f52 100644 GIT binary patch delta 4090 zcmb7HYit}>6~1?7_C5RXdcEHDJ9eC8^KjCV^x>2~(ljqxH?IOEPCT>bw2)GPTBqFd;B|vIvC8JVGX~nNXB@lu?X#NzHJQ`J0fLcks7=mL>xl%MtduW3CoxiL5b|TA-77C?m(KJg& zwF*2QkNoMlVu$Q7@WXSIsZ$!?Y=xJ3KL=jK)`6!l z^Y&RSZ9!WkcGS{g@SS!{_^g=RfhfFvuoE%nmlyyHKrfgja{)@M=%k;i%zs|V5>Okr z6EhRnjbhrAkN*V?WNMb!Z34&Pt|qLw)y6_Be8FcY>p^fa(kd%<(h4pFMaT-xQNYL? zwW3y%MJ{TKl#-c!Gn+wi(6e}+^0k&`1uY-kN+)6ZMa^!v+K+%LaF^)VEZg|GuGZ(0 zz9Bpt8K{8|7pfIgjB?l{a!mqm%&! zQN7o3eZ4+cEl-=yzkFZVl?%JRXbH1@i=G%U!N#~v$td0 zU!0yc>daM5!E-4-UUage(AsovGOU2s3A}^Z! zRus@HH4H6on9ZtK<-q8>u0Bz$v#L>$GDAQyw*e3}7EY>~lAt<7gHD5RZ=fj}Q^GW( z1nB^@6zcQ`ZVx9xTKe-P=dr-amPJ_@0zERN@Mo9~!5*ypSrp&%>g;9_W(n4IfzGSn zOxwVnjIbm~zAkjwd7tHzJV<(o*`CvN&{aB3uPhB+AaU0 zLdh{Qug<(G5~9^MnVf8Akt`8jD+xZWoTDOT1?H%ouo8?+h2~X03oVdhi75q?T?Az+ zO92h!K_!G9>+pJ#e_Zm@t0!ZftN51pi9%_Cnv5sLva19xdTSxoba{N>q5<&zV9q&< zEG$oGMHUsi4T8xt^c>`Xq)0DxvTmUDWXYm}M%wKn1N~kww~h4yhFCuvV66dI#DJZ; zzO?fSPh0vz7Gk=~YPV90s@+jfNlFYTDXV>i*f1_57}B-MkRRMIBx`lSl-;Wg>9VrRhIC6qy3vq% zWo9=R(PJgSh?L!H^?-@J3%y{l$NjD7v(j@ExZ{wh`s|F=>Rjj%{gz)0Os<)1hecV3 zx7CA7ZS`1vEZIqo?~POIYbVVaq#LLD5bKP=P{5$!HMNamBl^UxR)I_jqz>>MAvyOJl?+>TGyVy zZcr4>siUVLpr20SarCskd4L-;O~VxX+33J&+j%>3YupWbhbtG& z+fn;Wcl-7$&;Iy>#jjue*$Y>ezH|A_Coj*x;;C3Y{= zYv8}Nk;&;Y$LaV^ggXFS<-x-)-Nr|eATy(K&wjogdpnR#WH!tx`B1e{FIPm98Tnwf zC}iuW3O@`&&UXFgo$I-*Dr9{Tz>!*|exl)38M5-ga=}$0lk)*+am;`m4+h@vT-5KQ zW6t~fF1pJZj&9V}0NELf_6}icb=8_#b_1nGT^LUYxncZ49Cr}mkn@e`DBbP+E_w@n z;9If%kmC=;?me+maL9bE@@9Pu#LagB2#rBvhN_OH;Ym>)st-TaWSWjCI`u1>Oy7Rs zhCk8NAPp-qnuJlnqcP$qx`&GMUd#wV@e}@7k7TH`H@<0a4vpG~unA!^0?y2zMp!XR zwqzYN0*romOg{kBL27UlA6fckyh0;uag4WB&X%^}!}nwV5I{c6;Q(sX3iW0!9~70E zQK&agu2L^GPlDtd@R(RZ5nmF&2X2Kd-=FYFsJK$j>uryAtQ3bUbz#=ol00@Or+QJs zdq7Dp$a~?%vB>-X1toqCA4HJl-paS)uy>b!pX^XtTak_7!*4>k86c;wI3C}F)Z38i z=XYWIPK3J=@W|)85by}iMfiR2a>G~-6i)DB&EWfxDP4L$wDLh_2&jU=9Sdb!YiDa5n-3!t5HP%5O<;yQj{Q%k1pWxpzJfCJL2ni1W?(+xj{-pD7BAL|)l=s6 z`pATpL~aS7iCcO3?8PfD|H#XXAH3q!y4Sa4W{^1|fT9dR`r3``zzw9yoFKDuC&_$tS=GSY|GuV&ZP*d2(;Ts8m5&?bR4HYZbWzP|( zt#_#BJd&yL-;Vw?kpJNv>^(wN=f&Rdsyfx3FZSKs`mAJzA?)fV{1#S9HA74^*sA=t z1(>Up4`Ww`(zDQd2Ojyqh(CL}rqJ*pM|y6Zn}qCMYI1JW#mI@KXhPKue&Br6H%cd* zT>pEA^2w&CR7dW||K&=f{t$FbS?7&-6`t8$lFPs4zeq|XMae%2ZO66aNOt`f+lghnb&|%aBU`b{Fq*YYNhGD= z%72};kTA$CsN5;qOVCp259%O?v;ur6a>$`T3-r)K(H<6U;*-%o6h)6YBzR%>88cN0;we1xoJi{>||-gvD9n9l{c}-qEMa zFix@*j8k?Q#v?4vGVhS-QIHR?EXcFUZX5GYl1gsgKxl{-Z$D@;tEEww*w&sfcvx!0FxRTPs!gI7gx}1 zMhDpV#i0{{_5!r_Zvh0o;&XM^aDA@d4a^eP6ndAekr&C;cduw}&<#0MggTVbd4ms% zP+xZ)bYV9Fx=3F)E{v|WM%<`~z}!8q<>;bmF)dF-R9H-he~TFkeSiTN`SYX`pk(Pa zVRjA2CxRUc817IJWr6qgH43`%r9s%l>~HdGVF*+B;L);#neQ8JOvEM$gJY=#UzQL3 zC9R^%bYO=(9yqY;zTflJ9lO!?^aZ==88fZL+dKv@?fGkqi*}QFdfVZZI4{ffz#e)~ zJ`5D;xcnlpbLxPya%z0mcDzWvfk({k_VR+$3%!azhTe-@uQl0%T~#(^khD=pbjvcd zIE_$jCOo@niAH4CJQ~6?Q1L%2ADK5-R<%1HI6)R+(f8=8_MPv!5kclc%$nEu51lZ) zuuu3qx*KgqoXFZC-VvqIgth%+)DT-Ere&;v6Tnb%e+-^&s(2IJlcmeyJF@umCL;3~|0 zBuF>ivlrnt%}t0zf7M5jR!Jw*9bhStrSoJ>!&TjslNE^-mVtCgumQjz%d#BH!TSc> z^hOlGk)Ml5Hz%TVd65$7HQmiL(@J82BrQ_i!8L+Xk?anM45kgNmxm1oVB@S9fPB2; z=K2og*x;rEd2nDQ@q`0IBF75gN{$r)(UHMTM>M`~(~-Owge`|2b7WBD`;H7LM~2Xm zRl4*iaH1fR;6&OjiUPP;>=wXb)M`u9D^5`ibSS7#K~0t1oXB>EoRaW6!*k`iB*dhI zk0{{5h=M3FD@&Avn{IYO{l#vHEUYu&QfCCpghEaYv+{d}+US$J$-CL6>5MX~16$vX zPm!gM4C1`LZ9cTB^Ef5=sPq|ewnIw!*K|rQgV7~uQ)G<1N-mH~kW^!6rL#~k6C4wg z2o_Yba8GurSCOOg_mQggJf!>IZUHPm1t9lZIcZ0aX730iz39|iO^(!D83yWjE1nI14K2Qoa9;j6ewaQlKaG#mvoe!72ZT~hyl_Dg#ujVn ze7SiV?Asp!5NZKI6o4oOprxrnEiD8sLj4-_LFR`R`qI!%xC^YlM4Cxk|2$;M8_C^g zcH-U`U;Z>g1>qdRU4*U8H$C9HK~aFF?ijc-baMyaz5dr^orXtnPA}f_N_xkIGdMmE zFdgDRcCALWx!jmGoqEHrHd{9zTV7p8Z-V8|ptUi?#Fs?h;n7I{`I5gW|B!YvTNmTj zotTqXGE?XHAWW>79R1^X8UFuEw1nDW1a%v3y&q0{ux<=ww3R)meg*-Pj(-K9qHkpk zKZ(-k5Wb44Fh2o*UI?#?>NQ?#*c|D)mvApaZ`x$G1J^sG5}qNSKv|$xpHQ|cT4zz- z4|^24Dlm8;zmlKi+O#R3%g+V=?Ly_<`Lq0K{+R=gqVXuuco1m(V^xPC;p@}5u{0t4 z-56Z27TlZ2)dn}DZ?F=ZfN>ZYI|v+X@W}eH!HO1mAo5Vsk7T1T6Fct|flYv66vrHw zpA|;rFAD{^y;z`smnVx^dP-g{UV0*hKQ5k(zl3j~;`I&e?UB*ak@^MfP9jVpV9|Mo za~nQ*zKP=}3zc6)*=uM+U+G0pMH;J=UjnGm=~%5O!wJCb_f8!VIzh{L!%t! zmF;r>=&SS%*%|%pkowwH{M9>OG<)K;ohzvgNyqP4x&tGCv++J~Lb+bdF_daZbEy;`g7U2C6VCPciwd|&=q zkG=QVXYIAu+ItJ-EI-!-{#bpy0-lpWJxl*p0C*^V8uH>r)QUTHdIaVoDi=-m1h*RdOPRYq>hf=J%Bp0XSl@hg7 zD&=&7Ql^$m<(!_QRH&6wC8raWDs`STkJCv?wK`v#&*@~PMqMB+;B<eZ#vQgxZMOubIJj>|HXKbVcr*o7W)V0!DPUkA?)b-MOPUpb{o26y~?=Q&t$_90#w2>2dEnHTpw5n}Vo4Qrn%K0Lg>^5l|r-{-owO=pDb7kjkg6#CfjT;OT9TnU0oKEO`7N}hL{Ai1aS6FZIM ze)g&99&3yyxD#bzi{P@byQ4Q4np{cj?P$L(XmNKa-CKMez7a2To4vW|=w-wrCK@vT zk#0;TMnU|Ck%)jM(LqM%GLo3hVq@AShY3+bup~ zo!ROQ>xGPN93iG>m)qAvJstAQ4(tuvT@CFxN)iqB=E+<-e!Ztx83rVZFkM(AQ6$8W!CoSg|b zU1i$om*?D1Rv*O11mK-)fYVVylXqm7+Uuj=0yb#s7#i{n$U&3-Kzah(#PO#Ft?Hoc zQQRGrcI=~5>~zx7g_EGBk77q6(^K#(Maei@$szkZoxa||fzZt7&9v8aX7a~`9Gp%} zJwmKL9O4#)udqkc3TD0m3#Q#kzR9}NC!&p`)f0x%@36n8?~6AaE%ayms$efTkB|w& zQ5!pu(cb!&mNz+Hc1#g}zLqb$`b`srp7q5}#>pj`QOln)5W#2H9CEUj-zCacxl~R) zVkCkVGZ`;CwESK&MPTP8X!-pj^n8o=EMuQ#6lMI~S0h`;K|4W)bF~6FD-CuSv@*~! zR-c&>w^z&HvMeq$v#!k6K*bc1g?{sdNKa}daz&b;Wy%%xfRppJ)Ud9p7bIFL$X#+W zw$V~y>`Km;hxsbtOXPWBzPetJ=W8YKh9YeO&HS)te!Vau4mWiRtS)Owv|%_=u8|io zEh~?dvInzrtiR$Gu;AOX%!yhiaLLYjpnRL`^=Z3C5{u&f96Zo=8O|L zqu+=edow4;`Wr2o+Xi`4uFGzsC7PA@2a46_I*G*O+)8qY9m_2x&$H)q7dt=jsv=KA3R>c>-p;)cQ$irqT2hnCSw$nXV4a6)2eNa+8)a zVWt|}pTD)Kwprg#xV`96gw+U50H+Pj&CQ{W2CT~v6zB^;G@lk}Bm4%Vy}rRAw`VUs z$TA9K^5XPZL5yhnIjHC_*wLb=TThEYvmQ{XFBr|K!J&`ppuvTscfT`s%Y})%FW&X= z#V2q1;}0LW^zdO_cU&;Xlo=7z%wTI!Wvudj1Z9a`4N%AIRsLNlkYurcQXqOzx)WsdLTd@B&F z2xr)b&U({*NIuDGiszFPtfzRf6*syb*PdaI7CVa$AkV{Y48|%RCg?Z{O$Z{wkJ%^1 zC4uiC`8|Y309=)NIE#cxFRFM$%3APb6M+2>ICLj)c(&~)@G2s}b#bfp0V9!$oN z(gPz>#}MwF2MBRj@$K5$N(AC>b&!U9*=o9QUmlIs@Q`bDx zBsM+C=9OfUDb`$)kv1c1VRHi=8F&*2?{0Q$$qKV*A+aQp#7@6ZvYl+&jh*)(>_ymz zFp9v<#0|*Jj6qm8(2tR_L!h3qko<{lsL}`7zd$DXEB(&w_rvryk z&!hYypjuop6azg?MmU1djF5wHCqg*W(7S+z=HV2h?*YCXUD%Q#+=DQIa4*8uMxgfz z20?h5^;f)6@KscQ4dENtXoxTR`gB+2ep2{tRG&up?ll^sxBMqzCCPPc#k`@)0bn6r z&%u^{1k90iKfe2vMAVuzHego<{w@0Jtm^eULlF zY$xQt#+{Ix>3MATBZOI#!PT^|iJCF;8H-G6?azd4mMiD*Y?jVy z7q*j&?4E@cU0SZ3&lA~2U+QF*T%bj1x#2`MN6UpoW|Ir$M4rgZkm};JTs@Kbsx|vK z@#krIp)_QKBxVaGvAG~kfkacp6V~nQy@eTZ`?WMKOX0Fumb|DnFgKj29@dKGxsYbk z<++fI(jkc@hjr^9iKT1FAa}}hu#E<(Om=dB<^;b8edoEow@{blw*$$IA92kgmDBl6}3l zD9uPKIG3ll;v-by2rO7z8ePZJ-8^Pn>>|h5p(ReXV{tn91$$*lIeTbvojr<{g%eyE zdv9@$Ro2X*geS9Q^~G#iU5x9jFPW#hB%bQdYQkiSX40Zz&E`xQ{fQbJvf)4wMbEOK zx>D=A;S~BV`&M0%!9>&9t97NMnSENfD6R|A8YEB|SHlFyjO9z#kUzrAt}{f_LYUW5 zYfETG(X<6-lx2^mcZTK!6wImIdM2Fu&amC}1>`+;ynbn*y1B_kXfL`b_t+gs@m%+> zNUcU_LcksG67?iUe}WPoQ~nL9ml1x7@FK!10I(;2hV-ilzd*pWNLL~J65%xjl8g9j zgx>(b_$!g-?SG5Z8*KN|Mb_UT8AN!K{a|TT$$udE7C;Lj0DI0^nDc$) zDi90^A0QMWq#^t_%epQ#z#} z&mfo)K0!!AIDjyM@K=O!1QUWNKoX=pdsHI-DMB>D-w<2~pCQc3#pTz`#h+u#S&lL* z4?l}d>JWGwr2P5A$j{2gT`0R3;qM6i{r-W}V+fBU2m}C=FNOUp&?k_BT@A)YfaAJA zpGR2~QYM6G1T(@UDoz5-r!mM|5T;OQMaqWIiY$jVq%gfYMM&9g?85R@mQcnP&4m4| zqFk;Ki{cNAscLck0)Bad^_e`(^5g-1Tco?cNvV%hLu7P*}r9n4_K zD_gTNvN;(j9jQMnQ^)i+N_SfIU7?Fg>->Mbb9n)3zW)-eWDW7ufm6 zUy+^c2dk>d4)$NG@|yU{bN6zBK4|FNT^%&_s{BTc&I?J<^oVCZg+w(BpfE3>y3vo8) z!CifBJlS&_gROS;1qq!w4``nhOz;f#${w}1b0hWa_6*?7d}{hkOPg4U>!`w>$F90;@p}dM+w>2ri;|KSwV$_!-@D+UoDIOhp(Bq3534}a^ErKSl^vD_q z4X~7S3_EfkDU!6RFq&} zu~Viz)HDG%%Q(S!ZfjV|&cW`1UNp@kY{#}wdsjnS@Nf|y#+M38b2FF9s=veyDBXZC z>m~RiL5(ov{_Buhk8pJq3MR66D8# z{#nA#$;C_b7>08(b`B2h)AMU7S|#H0cy0(rbt!`#KFaqBH%T>X^epe^L30-lx)Wgx zd%BUj2|@R4lts2h2Pi_J!97A1z4B%aO?VB?cN4a-;B?$w6yp|8jc3?pPm-w(hb>{2 zt{M{*pdnJS#;%&AtDTYV08Nx}`bbwc=@@{gLy|y$h};q(g7M_evj)!}W2pB61a10G z`eM}D#=K;b!*+kd-(4fbpcXl5;D z9FAhL$#2svjlzzde!C|0nKZi`Et`*s+eN?4AFJ8CUB2i^vmB$v!o|lv1qS!UXvAmH zqI}jqTc2Gs_+tCw`s}hLO$brZX~K9ER3FVp3`D@MA6tasE}sL&wZV;8JUZr&n+S-b z^%G?D01Tc8w_JYL^Cf8_ly(i{2EPMtTgl)bMvz2nhN&pOwOjDVYYv#`tNsKnL57F; zQu=oLB|t9|jB4`F(c&jF;Kl~Qdtf5mFEcQsaiJo*X|;ZY5k^b45;TU^${?`xSG8e2yH8V{pqRge)6bvV6W|1p#@^5hHXm>BR=v zT93lkD(ttwL(js-f*3Vg$5%c{OX@3vzqv5fHCF$MHnQSdg$20#lJ+O@-PZ!+=E1lS zchDR7#LRLa+2ZHe5LM@rc-#hFzG;<}st{L_nm-r`C1Pq5GE z%j|gnLb8Vare9$zmAwI%i!MYto|W`VD8G&_MK%fHFl^TuS%#muX52!t$$EqgfM8nd z=5_9d#>UO7wrp`XtXzpdO$}?-t!mWIHs8mVRR|b_;eJ{IsNX8_F_}1qbw$IP##Z4%~1sC$G}sX2jWAcNM8>l#{Cg<7eUog~0X$OussPeci#kvJfxiWpTt7Y*X)PE(ZG z5KGLW4Gv8S*a(7cGO^9VSa#FEo&e#F;Yy&paVC2Z_9E;39-5^1BRfCHfQs-&uUqoIw^n z9FjJ#T09GM5Iz&bC*IH@2#+ti2VZTGU=+{WuTQ@@^0X-_;?t|KJ*IuSojtB)_R&tD zT_SvZ0t@R`F}?Ek3bHRFEC&c(&+v45RVD7{*x*HkUn0DQz|Xp`BlRnQD>b;Evnqdq zUU_RoU6AecFGxBEWG`NWX&(Zf2353Y8Ib!h-QNiu}XQcju@DY1(e`X*OMQ{aX*T?R|hu)81 zLM^zyK#wC^iBvSg-w=jThF2GwhmeoJZ(B~?nImr5fT{e03{a@dYxDh6>`8@~>0c|jQ9_S2xtaN;ZdpBzLAk2!77)taY z8Che#vOEIfi@;YXfSVB_uek-;HiUbi$y4l=@gj21^oQd?u@;vuXzm^war08oQDja0 zE2dX3h)<#Fhe}BPl?*TkC zJ$#3Wz?am$2X1t5$9AFWQ-mkk`2)o!enmXV;tx7W4OpSQzm{FScz!;7<2# zn1Nm!dYGL)xZE^}np5oZ!K!Rtmf$zxh#|NQFufmTOAqa_Bjvh@`f!jxvmYJWVEPJ@ z$t?cxT=Kwl?coiE^%{-{$1y#Ra0BWGgvh9z!l8radNAFH;#r1!&WmB$3~AE_-$EUL YP+NWNuJv=;908~kS8xmnTj5vwUyP4`+yDRo delta 9004 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 diff --git a/concurrency/__pycache__/PullVideoStreamProcess.cpython-38.pyc b/concurrency/__pycache__/PullVideoStreamProcess.cpython-38.pyc index 9b7facfa5bc21d1c33a59aa2180ba8b240c4e371..51d27cbf2934ea2cce471fd1737e73590d2350ed 100644 GIT binary patch delta 1890 zcmZvcS!`5Q7=Z7Yg-$zjXKTyMbk;ljw4JhrMNo(eL{c$C(k9l_P&^dvpk*!>g!a@z z2iXd8%P~N0Os0x)3kjrXP!S%CzNmo*9thEhv1NHOR!ATk_5aVzR37Z4U(WsSzn}lV z_t*XUti4T^Yb5yNu1_}aT7TBQzlL1n$7{YdU(`)~ExgNmg52N_tYI?EeYRNVG*gOp zT02f?C^t(d>J80NbkZ=hROI7EB57{spplBC+dyUNID+yZt7G*AgKkhi)?0xSei;X3%p&*M{GXd4iPENno4iAuomf2dZJX}U)xrZ1h1B} zYf9N9HBZquE|tABmc9I?*$UD?Ba$_GC7OcBMs+@TP0=*y8X!OPnHD|=cRoOXDK!oP83t2$V%ZdSkG z4;=H_Iz-jv(yevW^#cHC`^Got3mrJbysdYXTWEXab2mi&_l2(_Yh9} z7w6ph`mB71Zq8q2GP5&Bw{fM^X&;Dcbu3yS1cKzLFgrJ6b`H$i$efAAE|+2BM~3T` zt}UC_Yh9{#y-J*Vx88daM)~IO!JD7%xqWHu)`!EB=THB3;jp?XzkSm-Z4F)8KhQj- zk4%kSymfH@|qZnH8?pAr`R%bfPp4 z-f>9LOANj6KLV{}A72p+!lHEs6@STZ6TGvE!4H)()s6YPd^DJ?dRN3s@*jf!7o%d) zUeH`jrYYuSK2|S=vs@ihSUpX9B^WECdQ8}59*W;GQw5$dnqi0tt;Uj;h}jxaJh%TR zLJe)=g;2`zC=7pG3_sS_%s&q;4DT!tKT5LN0_cP2=}gUXI9t`us&$k48Gk%HudQ8l zEGRk_6djXb%-b~^v%w<3y@^FIsaL48a)+=8@GP=*m$GF}v|-Mo6Fw$z;+e=?3oJo9 zd^4`_f5JZa-k{2v8I?1j(nebNV5F72^xk(7;_QOiR4D?dRPE;9D^HWn+!tL(Ugo{g z#bguzAbNxJ@B^{tcn(!8h%JaG5cP;x5VH}l@@uiR&u_zHFJdcV1wun?M;H($#14cF zAtPQx>_oT`dBiS6A7UY*pYM)`3FF0haBvR_Rw3R(3?g1GWW delta 1689 zcmYk5UuauZ9LMjuNxC%2&ELi3rpdjzO`0@m)3uD+>2ym(v4ZmtPS3iTIA?B; zw$zi(HM&ima@pzD3PVy>w1_WKECm$=!8gT6K_50mnIMQhh`vmJzmwY8&=0?R&hOv( zo$vYa;lIX%6Po5z;P1(SE62VZ|2TNoM=py?zOOva?aldKCpkh9iV zhHvNbrs}Bn3(VkMO+t;D+adN<7Ue-|igyE6EX(uUyX+zg@1;u33%fVO*8yF>orPLq zYVp4IE;CuSYE`?bA^r)Bl5R1oRraq)pBziH^kro;OIc=7?JroMsWi$+UQQ}B50zE> zPlzbe9`IF(B6If2oS$kv>bUGDc(fH+R?rf9FhdGrBxoHpbOpND0TG(6 zG(EIPLvKUpj=R1-*YA+}9tstCzwE$mA7(zD;@&1!x_Nq+{p-!skM?rx1y5hvjPl98 zOS11$QfX9ph5Mm*w>>6LTY_&HA-f-x-TOm5q%4L)#l&hmH}B$Uo|tq^s#K!^+9yti ziV?ScgD8ywqRbZL6#B&nq2Zpph=RZN3LA!L1zT}BO*gD&tL^!aaAljpV~)q36T{)5 z2}5?7m0f0Gx{;dVbl3*dxYi^Mi(7D-PVio$QEs(@G`37?Dt^l|Y;VsWCJiy0lLkv< zB73qON_S7YMm1en_p5C2_iI)pHqS8WjWS$H;x+T-qcXVl|z+bAu&$l*d4(#Quy0 zTOpd}S?-aSlBF3b*af+6{I||@ma2AD(;(q}nY;I|%iS!?wk#N2JJK(&li1gpA7to9 zaz6|zBxPtoL^p`rBV~x$ax&XDnFHj0kuowM@Lh)0WrE;R)jrtsOTp!+CI#oJZwO{o zc1+63c^>DO3oopbN4Q5yuELY>;7q9Jvb$M?YqUpvYb5p-k_udw%YIbG7XR170QMj& zqJy3RZiV3?gC*P+$jeht!Fye}U?gImdS3dlEguFx6Qo}pwhj<_<$a5g zXT*B<1LRrZ%8hp%1)TVRMm&f(gm?(i zK#U?B#48AnxD~MzaU0?_#2n%j;#I_H#5|&jcpY&DaTYO+IHweWZ=m@m;w{8^#5;(6 zhzp1XaV-_|T?F%c_@7e6y@g#w6=w>+lS}Yelc_~m{tmZr7+&I5ZCoi8?V9+oxQEo& Pekqm+SroC-A)@~a7*(%= diff --git a/concurrency/__pycache__/PushVideoStreamProcess.cpython-38.pyc b/concurrency/__pycache__/PushVideoStreamProcess.cpython-38.pyc index c89267d382aadadb613a7ba9e50bcc7662797d8c..c67b250ac53168c0d505e63c11a50fe0100750dc 100644 GIT binary patch delta 5156 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 0: analyse_results = dumps(analyse_results) taskbar = { @@ -23,7 +23,9 @@ def message_feedback(requestId, status, analyse_type, error_code="", error_msg=" "analyse_results": analyse_results, "model_code": modelCode, "detect_targets_code": detectTargetCode, - "analyse_time": now_date_to_str() + "analyse_time": now_date_to_str(), + "longitude":str(longitude), + "latitude":str(latitude), } ] } diff --git a/entity/__pycache__/FeedBack.cpython-38.pyc b/entity/__pycache__/FeedBack.cpython-38.pyc index 4b14ceef169acfdd1a89176b78cfb526f9fdccb0..0785694ed7416d1be4cc7b47f6e5e45d12412a77 100644 GIT binary patch delta 596 zcmZ`$%SyvQ6wN$LlQy*~qG(&Fk4;3;jSE2p5f_D`pa{i<5}jCzG0~e;5Og8##X8&i z0dD*O7yf}C5On27DBaY#3N?b>VGj2-=bpZgh6+ z0_p)21Ou`|=1RTjqF^u)aJ%hPcj~TIfS{H6m_78$z{Of#VY_`k)!>&Bu2AsTRTk@LE$UB~sk9=Xh osB%z3z-odF7leX>*jPLYM8k8J@DIaL1s1iKhEdWw>0;XY1cV=OX#fBK delta 559 zcmZ`$%}N4M6rQni9GT1al}9wm{eb2%U9kMBE&do%uQE*#jlsYqMx+?JknMft#F)Xdfb z#O;yFgp4PpZ%g-gTaRnAjNIuZm1%dzmCfj-T~_xMXDkb#1dJVwlKt1jskVpKgqlBpg>eK zNJdSH7qVz{X^(XD2*kxF*}67x9BD_1Fhw4eE>wY)D59J0mP7F zYRHi*a?bK@;bdOc{g4DDOo%#sT|Ed1@v3E1LxicL4^9)CG`91HY}+_5GhR(siq+qe zky^v^a(*4SdpZ59k)GJ9V@E_kYBuRC8UW~pK8Qd+7$=23L%0B<@Hz~@8!(t* z3gIja!8v#naE2*@VNf6jZ^8KtBdJn=o@b08Afx^Ww)+JPoYhTL0 zn2NlL2qmfkN-v^30S<92Q?1nD334avf%wQu2JKrW9H8y~;V1KsBJF}>#f)aPL*5EA zQni!Cbt1ZYOX79!SB1seKv?qE24XHs>etuxsn3&Z zx0CAE`tnk8aVBgT9z27UuBg&W7JY?sKlLJi))ZPJc14H^;7~MXDS@;8Wx%f&;2dbvW1_GtvaKz}EVDESqhYt|q^oPu*R6G#%H~b#B%#-APSf zidm?6-@s1ExtY}3SImu_^tt7vdMka3(&OxcKKJonj%0i(mG~^3LkSdvwzmkjyy zP9Z92F%4+JuTaEc2Cp(W!{9jzD>6RL_9F~N88kE2fLSLvhk=!4u`w`^nsQ&$15pr$ z^QlEZK4g}SNTlnj9eG!@iGsK*{1G!vlIligY$hD*>4^^av!RW3(-eR} z1Sul%smZDc2L3*c3IY?D!2(uAR3xxXpa}$7l(SRL!B;k&XAYgGlh4z|=jrD2%xzCs zzQ4Zx#fM2=pA*~H6RFGJ>=Asg_}s6h0g=Wt=DNc5q*(hq%`m&H}&;gjC|s{ilGrQ7>gmjCg}#8W?pcF48* za#W%v>VHC&;q0!q#?J1p*6!xl+B%w=PloNCr%#+{?RqhDbhNZ~Hox4_`4X9L@W^f| zFlh{VNTR`ln#lJJ&zq`UxpaAm@yM>|kccUOT~AZ53bbkN8G?~UMZx&+M?tUADbeB7 zljXn*&WwYJIkd+Hxjo;_?KHH#!iaO(Bs~oB$l+jHX*J#2sKYS(7|arV-GXsfmNWkn zt|m8w)3(1wh05I_8dbugWF93;IHW~G{m8@8;Uf&33<3;-L_c~|W+C*3xg>b31r3t% HV|jl8)oIkV delta 547 zcmbQ!!Z@vxFO-*;ivb9XzxSm#XKm#B!^AjmGdFV{qbYkzN=j-~lxi5o7*dqM zq{CG$oR&p@T*&Hmc$-y{#bFI8F z6XUGS8x{94GR~P?pe)KZ38a4V0IgAQgV4xex^sH^2&jn*B7{iUdIR2!aTq$y@Dw z6*Yj&3qS?MLO=&{Ff%bQF|hq-VS&=jMH-Wp?c2FgblIy5n*nt_1?ge|>tbOpGTZ## xK7&ydWL%Lkh~NbgCLqFea*m@lquJyYj1$E6@Yh^yUXRJi=;@AI;dM~MTZX^m955z4Igph6j5x;jBT0aP!e@f9FrDA!sXT8*M+;E=5DMgLZ-PshyoXo3wS*pXyBVL18A+IE+7XvmDE$DcYjo!}p8aq^Gc4ts{oP!}zxW#D;` zhOen}WGG+;XQk()Gtw}jm9*-VPOCS=?lLx7lTpkH%Qj1>Yh1ZV*e@&_byY|-GH!#n z-xl67%9L(~XzeUHNz8DzlGa(WrOexiWGQoGOriA~q&bqUnwN+~r2(5{G~{|6x0R5g z9{17obX#m*yw;uN{8IzN-ktJIhDp?|)Vl+85A_g4y@n1W9 za-8sko*>^?w1-4idgXW(xYUQzgqg3$0L))|9|Rsey4OB z*~t6LR*~C$w5(?99n)dSuyJKvVRtM!>ztQ1OZzYHlQXuAVksb>&Zw3;=E`W6mUUBg zo@DHnol4_6yKLIB9t!$$iN9agJ!5H9-ym7im=^{VS4bJ%(y60D0y=>jv`U3E3lTds zdT8HNwdtFMSebqpQI7GRCGZx=2B~u%q&?E1CPgwU#+`5my##uK6&G}yp;>8OCemK$ zF$fPtTQWR5dCGf|?BIX#Zgx&4(rJigUt^kg`}R7c`f`F?@EL(Hdk9jW?L|ZpwTOfK zm%e^-fP4I#l>MOKPx$M|5NH13Z83Nqh9|uNAju`9T$W{B)`?Dhqy(rDC$IfZCAR325?K+Kicp(+dhqV&`haQQjA7A=h|3 zG(?Upj_z^Ipy?!Hmd851{8o!XzRvr?k^KcH&?4q&LunTxfT%$nMLdl-h8RNF5Fx~I zfT6KIlr2OWkwJWczZ0$_&*$>tvE}_dTGb4G%>?{Q+do&;5&CcQvS-j+bvsP`8hvP*W=9VaB&CB7&G~*o)EuM>$TY|8-JoVyxx{o zsLhg-1oKs7p|X?3ah(?sR}n7)45bhmbRlnxPg3?0FKzY){prLM-84y`N^KfVPSDS> zR2&lbHxmDAZ%!iw@uIEvK;b7NbBTeLQx!z_C5A)%c?g#NzRtW!7%hnlm zmTdwUMGx$8C62j(XhaC#y(kIa?Vlcx$dJ4|JIhcL}8|EJ!;nTH;gd(ckVr7 zFZy2B+Cawm*4D1(@PrAs0nX6nD4gMBdZaXWv-Kbe zp&M)xF@?B}5cxR9e_tO|vG_Fd!L~tu!>RC#wJLd^cdnr`)FN4l%JYQk;~F~+h16}4 zWu4<36v?TL)VZV?m)RSZl!YFq2MZ|3MV3h3sgP+m^|9hHC)FyXMad2&Sw2ZHu@_uB zMW_lnjfs_4%-AF8@w_^boJ^XcA{7orW-o&|Y8SUAHEj@C7j zhO!*}6zY8!xofL1fc;pka1+F<{7!Gb zPQ-0Ds`#4Ebk2Mpd&CeM5sx9ZBd#FCwVnql@5Y}j$@pZ#98FR73L5d-#l#H|c`s5; zl!;+9bRjk)L_%Wd delta 2605 zcma)7X>3$g6nRKUx0oUFc59>1?GgFHyIbqd z7CzypF-H`LLK<^LKorq9gM5P`qJha#2B}UsQ@J8Vf|V zsG+e?)C!BnfT$DoG!}^)L<5bLK`~P_k`NM2otkyyR9;7Hc&IPFc70TKM&-8H+NkBk zNnAtKajKm8^wSC%{whlx{gm;^wxP$m7?V=>9#{&ubCDC!f0{)!06;|Ut`FDT^kL53c8}Mv? z9ZX@Zw{*d&xHDlRUiyG8PbF*!cXufpwq3xb&P`=J-# z^UsGKJndhA^9v$yFZLF!bFHC<>ZRZCJUm%Y>~nz)JYayX@xM*8ozrb;Tj2_Teq0r( zGh*Z_H{rfOJ*__;m=6;F3e>``bhv0g7;(1tDuV>sRy-#R?0%k^w2Vc3pV zs1}~WyF)A^uQ?upWmZE9fLXkCeGLu~D%Z!#^Xl;a#jQ zf04p`Ro>-R8AsURF`QXZ0Gn`Og$1AD=88G^eB}-pMqgC~zQ)$7B&6_IRgFWC^S5}a z>Nk#1-R|C_wq_WkA{S$0O_h5uPxmoAsyO|K+iPy?-cJh4BUi9~+P*yPWC$@l&Y&t? z$&xyUe3qUdxKQM28LtLL^ZmgjgApKIq8VK^{ za*$yo!vupm@femi1{_hE`?0;T3&XRWSa;KFxs%R26=QjjUH9MvO~HVCmSih8b8c_2 z-oem=A2&5co?_8pc!A*v!K6KtZRRF$3%goKT@CaA1o7l7Kb~!IV%Lpz=XX8Q`4*Wk z+aQZ$^)RT8NwcK-q>LqX@s6>in&mJ{Cc}#iOhF!3+jfxHeEGJ2%=&0hRV9-k`@YSv zh~XUu@;`t2+0#;Xvi5ozy~56ycwker4!2@U^FOWfs#N)Fn+d#Cou$L3Se5P>_TfhFcB)T!Z%hnZHhB;u zZT`p=@vcl%e!$&koS@aa0sAVe@tL*)2;;G~rjb65yN2OrhC3MeL6_>{@SU0R@CPim zc4IWYezTA%Hu6I&RbQ)?R{f-I9^Y8Ww@GquXS$ZVL7kA~;>z0@I6Fy%?EIb(Io#Fm zT+~cT6Lh=TY?hicOuy+hbImLpxE!Wo=9s4GCE07{k(^_?$>ub(7-b_Zw3cQbk^||J I?Mv+c0i#?|^8f$< diff --git a/util/LocationUtils.py b/util/LocationUtils.py new file mode 100644 index 0000000..d63c473 --- /dev/null +++ b/util/LocationUtils.py @@ -0,0 +1,156 @@ + +import os,math +import numpy as np + +# WGS-84经纬度转Web墨卡托 +def wgs_to_mercator(x, y): + y = 85.0511287798 if y > 85.0511287798 else y + y = -85.0511287798 if y < -85.0511287798 else y + + x2 = x * 20037508.34 / 180.0 + y2 = math.log(math.tan((90.0 + y) * math.pi / 360.0)) / (math.pi / 180.0) + + #print( ' y:',y, " before Log:",math.tan((90.0 + y) * math.pi / 360.0), ' log:' , math.log(math.tan((90.0 + y) * math.pi / 360.0))) + y2 = y2 * 20037508.34 / 180.0 + return x2, y2 +def mercator_to_wgs(x, y): + """ + 将墨卡托投影坐标转换为WGS-84经纬度坐标 + :param x: 墨卡托投影的X坐标 + :param y: 墨卡托投影的Y坐标 + :return: 经度(longitude)和纬度(latitude) + """ + # 地球半径(米) + R = 6378137.0 + # 墨卡托投影的X坐标转换为经度 + lon = x / R * 180.0 / math.pi + # 墨卡托投影的Y坐标转换为纬度 + lat = math.atan(math.sinh(y / R)) * 180.0 / math.pi + return lon, lat + + +def ImageCorToCamCor(p0,w=1920,h=1080): + x,y=p0[0:2] + return x-w/2.,(h-y)-h/2. + +def wgs84_to_gcj02(lat, lon): + """将 WGS-84 坐标转换为 GCJ-02 坐标 (高德地图坐标)""" + A = 6378245.0 # 长半轴 + EE = 0.00669342162296594323 # 偏心率平方 + if out_of_china(lat, lon): + return lat, lon # 如果在中国以外,直接返回 WGS-84 坐标 + + # 坐标转换 + dlat = transform_lat(lon - 105.0, lat - 35.0) + dlon = transform_lon(lon - 105.0, lat - 35.0) + radlat = lat / 180.0 * math.pi + magic = math.sin(radlat) + magic = 1 - EE * magic * magic + sqrt_magic = math.sqrt(magic) + dlat = (dlat * 180.0) / (A * (1 - EE) / (magic * sqrt_magic) * math.pi) + dlon = (dlon * 180.0) / (A / sqrt_magic * math.cos(radlat) * math.pi) + + mg_lat = lat + dlat + mg_lon = lon + dlon + + return mg_lat, mg_lon + +def out_of_china(lat, lon): + """检查坐标是否在中国以外""" + return lon < 72.004 or lon > 137.8347 or lat < 0.8293 or lat > 55.8271 + +def transform_lat(lon, lat): + """辅助函数: 进行纬度转换""" + ret = (-100.0 + 2.0 * lon + 3.0 * lat + 0.2 * lat * lat + + 0.1 * lon * lat + 0.2 * math.sqrt(abs(lon))) + ret += (20.0 * math.sin(6.0 * lon * PI) + 20.0 * math.sin(2.0 * lon * PI)) * 2.0 / 3.0 + ret += (20.0 * math.sin(lat * PI) + 40.0 * math.sin(lat / 3.0 * PI)) * 2.0 / 3.0 + ret += (160.0 * math.sin(lat / 12.0 * PI) + 320.0 * math.sin(lat * PI / 30.0)) * 2.0 / 3.0 + return ret + +def transform_lon(lon, lat): + """辅助函数: 进行经度转换""" + ret = (300.0 + lon + 2.0 * lat + 0.1 * lon * lon + + 0.1 * lon * lat + 0.1 * math.sqrt(abs(lon))) + ret += (20.0 * math.sin(6.0 * lon * PI) + 20.0 * math.sin(2.0 * lon * PI)) * 2.0 / 3.0 + ret += (20.0 * math.sin(lon * PI) + 40.0 * math.sin(lon / 3.0 * PI)) * 2.0 / 3.0 + ret += (150.0 * math.sin(lon / 12.0 * PI) + 300.0 * math.sin(lon / 30.0 * PI)) * 2.0 / 3.0 + return ret + +def cam2word(p0,pUAV,yaw,delta=1.55e-3 * 4056.0/1920,pitch=-45,f=4.5,camH=50e3,igW=1920,igH=1080): + + pitch = pitch/180.0*np.pi + sinp = np.sin(pitch );cosp= np.cos(pitch) + p0_new = ImageCorToCamCor(p0,igW,igH) + Xc0 = p0_new[0]*delta;Zc0 = p0_new[1]*delta; + + #(Zw0,Xw0)--相对于光心,X,Z并未校正到正东和正北。 + #f=4.5*f/24.00 + Zw0=camH*( -f*sinp + Zc0*cosp )/( f*cosp + Zc0*sinp)*1e-3 + Xw0= camH*Xc0/(f*cosp + Zc0*sinp)*1e-3 + #print(' %4.0f %4.0f %4.8f %4.8f %4.8f %4.8f f:%.2f'%( p0[0],p0[1], Xc0, Zc0,Xw0,Zw0,f ) ) + #yaw定义为拍摄方向,即图片的高方位(Z方向)偏离正北的方向,北偏东为正。 + yaw_rad = yaw/180.0*np.pi + siny=np.sin(yaw_rad);cosy=np.cos(yaw_rad) + Zx0_rot = Xw0*cosy + Zw0*siny + pUAV[0] + Zw0_rot = -Xw0*siny + Zw0*cosy + pUAV[1] + + + return Zx0_rot,Zw0_rot + +def location( point,igW,igH,PlanWgs84,PlanH,yaw,delta,pitch,focal,outFormat='wgs84'): + ''' + 输入图像中点的X,Y坐标,及无人机相关信息、相机相关信息,输出该点的Wgs84经纬度坐标 + point--点在图像上的坐标,左上角为(0,0),X方向为宽度方向,Y方向为高度方向 + igW--图像的宽度 + igH--图像的高度 + PlanWgs84--无人机的Wgs84坐标,(lon,lat),(经度,纬度) + PlanH--无人机拍照时的相对高度,用mm表示 + yaw--云台的yaw + delta--单个像素的长度值,用mm表示。 + pitch--无人的pitch + focal--真实焦距,用mm表示 + ''' + PlanX,PlanY = wgs_to_mercator(PlanWgs84[0],PlanWgs84[1]) + #print('location:',PlanX,PlanY) + #PlanX,PlanY--东西、南北方向的墨卡托投影坐标 + #print( 'line268:',point,PlanX,PlanY,yaw, delta,pitch,focal,PlanH,igW,igH ) + cor_world = cam2word( point,(PlanX,PlanY),yaw, delta,pitch,focal,PlanH,igW,igH) + cor_world = mercator_to_wgs(cor_world[0], cor_world[1]) + if outFormat=='GCJ02' or outFormat=='gcj02': + cor_world = wgs84_to_gcj02(cor_world[0], cor_world[1]) + + return cor_world + +def locate_byMqtt(box,igW,igH,camParas,outFormat='wgs84'): + #camParas--{'lon': 3479.8250608, 'lat': 3566.7630802, 'gpssingal': 4, 'satcount': 6896, 'alt': 3.256, 'hspeed': 86.0, 'vspeed': 4.447911, 'ysingal': 0, 'tsingal': 0, 'voltage': 24.971, 'flytime': 0, 'datetime': 1739315683895, 'yaw': 70.243252, 'roll': -0.89436062, 'pitch': 0.89897547, 'armed': 'false', 'mode': 'stabilize', 'distToHome': 7.132033, 'deviceid': 'THJSQ03A2302KSPYGJ2G', 'mileage': '0', 'altasl': 21.26, 'altasl2': -20.74, 'landing_target_x': 0, 'landing_target_y': 0, 'landing_target_z': 0} + #模型输出的点的格式是-[(486, 264), (505, 264), (505, 290), (486, 290)] + + box_np = np.array(box); + point = int(np.mean( box_np[:,0] )) , int(np.mean( box_np[:,1] )) + PlanWgs84 = (float(camParas['lon']),float(camParas['lat'])) # + PlanH = float(camParas['alt'])# + yaw = float(camParas['camerayaw']) + #delta = camParas[''] + delta = 1.55e-3 * 4056.0/1920 + pitch = float(camParas['camerapitch']) + #focal = camParas[''] + focal = 3.5 + + out = location( point,igW,igH,PlanWgs84,PlanH,yaw,delta,pitch,focal,outFormat='wgs84') + return out + +if __name__=="__main__": + srt="videos/DJI_20221220133918_0001_W_0.SRT" + videoUrl = "videos/DJI_20221220133918_0001_W.MP4" + imgOut= "videos/imgs" + fpbeg=17273;fpend=17830 + nums = list(range(fpbeg,fpend,16)) + #generateNewSRT(srt) + #captureImages(videoUrl,nums,imgOut) + + process(videoUrl,srt,nums,imW=1920,imH=1080,txtDir='videos/labels' ) + #draw_results() + + #rotate_example() + #rotate_example3() \ No newline at end of file diff --git a/util/ModelUtils.py b/util/ModelUtils.py index e49f85d..26c7086 100644 --- a/util/ModelUtils.py +++ b/util/ModelUtils.py @@ -331,6 +331,8 @@ class IMModel: new_device = torch.device(par['device']) model = torch.jit.load(par[img_type]['weights']) + logger.info("########################加载 ../AIlib2/weights/conf/jkm/plate_yolov5s_v3.jit 成功 ########################, requestId:{}", + requestId) self.model_conf = (modeType, allowedList, new_device, model, par, img_type) except Exception: logger.error("模型加载异常:{}, requestId:{}", format_exc(), requestId) @@ -346,6 +348,7 @@ def im_process(args): boxes = post_process(pred, padInfos, device, conf_thres=par['conf_thres'], iou_thres=par['iou_thres'], nc=par[img_type]['nc']) # 后处理 dataBack = get_return_data(frame, boxes, modelType=img_type, plate_dilate=par['plate_dilate']) + print('-------line351----:',dataBack) return dataBack except ServiceException as s: raise s @@ -613,6 +616,29 @@ MODEL_CONFIG = { lambda x, y, z: one_label(x, y, z), lambda x: model_process(x) ), + # 加载智慧工地模型 + ModelType.SMARTSITE_MODEL.value[1]: ( + lambda x, y, r, t, z, h: cityManagementModel(x, y, r, ModelType.SMARTSITE_MODEL, t, z, h), + ModelType.SMARTSITE_MODEL, + lambda x, y, z: one_label(x, y, z), + lambda x: detSeg_demo2(x) + ), + + # 加载垃圾模型 + ModelType.RUBBISH_MODEL.value[1]: ( + lambda x, y, r, t, z, h: cityManagementModel(x, y, r, ModelType.RUBBISH_MODEL, t, z, h), + ModelType.RUBBISH_MODEL, + lambda x, y, z: one_label(x, y, z), + lambda x: detSeg_demo2(x) + ), + + # 加载烟花模型 + ModelType.FIREWORK_MODEL.value[1]: ( + lambda x, y, r, t, z, h: cityManagementModel(x, y, r, ModelType.FIREWORK_MODEL, t, z, h), + ModelType.FIREWORK_MODEL, + lambda x, y, z: one_label(x, y, z), + lambda x: detSeg_demo2(x) + ), } diff --git a/util/__pycache__/LocationUtils.cpython-38.pyc b/util/__pycache__/LocationUtils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1d16ee5a967df745326a8cedd0ae12a7a3c0cda GIT binary patch literal 5203 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 literal 0 HcmV?d00001 diff --git a/util/__pycache__/LogUtils.cpython-38.pyc b/util/__pycache__/LogUtils.cpython-38.pyc index b28ac1484fa3e26ce654f22ba15bc35aa6edd548..d6eeb6e0561a243b4ac8cf84f92deb9ca71bf888 100644 GIT binary patch delta 20 acmdnUzLA|fl$V!_0SM#_k8k8&#tZ-~=LB#7 delta 20 acmdnUzLA|fl$V!_0SJu0_if}}#tZ;40R<8O diff --git a/util/__pycache__/MinioSdk.cpython-38.pyc b/util/__pycache__/MinioSdk.cpython-38.pyc index fb08a4995aba983f9e0e2a08ef253f82645b3214..3ef6babf0897462a8e35617c7621c18075f3c268 100644 GIT binary patch delta 244 zcmew_b3=wVl$V!_0SE%5m!!Yi$jijeIAgK^yC37d$?@!_j75{DvKQ6YFl0%j@JKSG zFo`qNu!uuwHgSepz7oa-OewrI%r#tDl0Ym~!?%!?k)eh!oFSNjg`q?`n`;7N(F8_@ zT7E``DvuhD6h3o?T8gK3n&t?JYYXFMN zr3jQT%1@rip~@&Yc{|6H$?=>w7!@X4a4ntugzFij!{pQ4dWE!D5$+&D9YnZImg7qV0K_~y`2YX_ delta 263 zcmca1^IwKHl$V!_0SIPDEJ=U4k(Y^`anWP}c0a}!ljGS<8EYm_WiJvakx1dGVQpq& zWT;`tl1$;9%*!E}$XCN$!<8ik#L_i<3t543eBlhi3@i*KGTB@c7>i~xGSu=jGE{lg zaHQ~?Gt_dF$S#me;a|we$dCdwC!VK-aRF0`Kn+I?^Fn5zZjKuEY!;xtE}*!4ieQPt z9rjVqR*T~>3g#;+Dq{?&> zU@8jIx z|D3(&?(X>y@xPy7cc;x}MsPiR^X$fDy$F3zJN#7#od)>reD7m-tzplG!bo?-FV#Dc z^s>~jAJM)vKwHuQYPLJ#ybARQ zE0KgC5<4lY920tD}Xst1h<3d~)*T)TUW8ZURV1|EBR43)dEc`o*Fk-B7qIaxo%@o!<*C7k$*^Y*zH-F- zGQLCxygsm>drKWBC_5kAkRU=>A_PLMd^PdFD`IdOds+g!-si;ENWX6i{)oKqtH9Tf zc-YA#Z9iG*v)oS#wANzg~Sw5W&$BqYs({0((# zB8ByH$!N{;ytCl=03ottk;icZrapkc=s%r&lRDm_<_B`TuE=~Fn&-h={)rr$JEK5x zj>9Odxyf8Eq+JT@=iwV<_PnWhlucbzrrKs(=xX_AYVNS<>kMvF;Jc{9ugqbDM+a)B zap+NP^eu)?EB`Vc{2dSOt#fnW+iYbfs59f&-eGHtY1A&Ae2O}lsQHwdZ2or{D;>q3 zbUK^fJw}2%XPRHeMR8x5n&8g;#lV>$_m4;a&7)nlpYBd($ncO3O`%Hfep&k1UDm38!YnRLk)a=TC~A7ZE!vhKGisxi?~o5 zT*Sbs?Q>!IXHT0WNA${g z(I=QFl;hn6E-s%^22byu>L8af^dq;{$-qt}8z;-g8fab79Ps3%GgVu$LZzrW-_w~Q zq*A?TI+uz|8|+qre;a>~X7b<_i}@p4r49C|z^aJ7JUH4?&P6;|8(gamuH(T+TlptJ zy*9W(8{Ei)PcPx01kKvu#VWAs5!1rJ`869&~%30+97J_m#Cb2OVCe5IaS@Mx5~G)yO5f@ z)ZC-y4{A~$K=;YXU{H|ttzqH6A4GA-}FnEK0l+a$^$iw3dkU Qn_Uk-rb8q|4N94i@;_Nk>jRHK?f4@3-=V?I*VTXTeptBj?k%kYQ^?Kuz_w3m1B|U=U zNN`#oDlnXdsr`rPXC*_lw$x_+f(ZEW3&%~~47#f{)3zd8@LPOoKGB<+EgTY`Cw;<@ z=n=dEFf!@urFW^N>~m61FP0V4+hy{q3jiDyb{YaCAO>`Slz={9*#9s+==JyvzK{4hf@%cXbeh&M)~=eMYYY5h$&t5g6%~@;aM5 z3{GW&!VSVH3L}LuCXjR@5(|;wH3-JAL9`MBj9Hm6 zSe~F=CD!0;6_1LlL)BWT;9S!uHJ5+Sj#f`Pc z>bgu{g5E7uldsX?E%#;5L313!#V?(F6(@c`5u(F+nZ|3-JO>u?Je{a3Ge?yJFgi}? zaQ(`N!g)nuabq2sqn-6dxtm2JowEGP7WMmma%*%5^d+1Z5Afw(8;GzAr-}G6!HA8GnNv?A2=OPZ-J3u z<;phYb5Yz-rv7i`78y7e7vlZ||RO4?wfHrT|2zjo(x5nHsu=?om% zJ_nIcCa!V@L+3|pY!Vf)#%4|K#@43Z{s%jon%lWrvoe=4X5{3@Pur>`PNx%{W-+Hw zj^<_umro9ZC*6TuhEBQzHU_pwv$3;mmUp*qZ|<&Il8#;5W1-5U>UV-6EOg`= z`yRVZD1JrpJBk}9BEPtc*t$haJU#S)Cx?!C){;>=>*>(hq!mGDpOfeg3P1h_(WXVq