@@ -1,6 +1,6 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project version="4"> | |||
<component name="PublishConfigData" autoUpload="Always" serverName="192.168.11.7" remoteFilesAllowedToDisappearOnAutoupload="false"> | |||
<component name="PublishConfigData" serverName="192.168.11.7" remoteFilesAllowedToDisappearOnAutoupload="false"> | |||
<serverData> | |||
<paths name="10.21"> | |||
<serverdata> | |||
@@ -89,6 +89,5 @@ | |||
</serverdata> | |||
</paths> | |||
</serverData> | |||
<option name="myAutoUpload" value="ALWAYS" /> | |||
</component> | |||
</project> |
@@ -5,8 +5,21 @@ | |||
</component> | |||
<component name="ChangeListManager"> | |||
<list default="true" id="4f7dccd9-8f92-4a6e-90cc-33890d102263" name="Changes" comment="Changes"> | |||
<change beforePath="$PROJECT_DIR$/.idea/deployment.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/deployment.xml" afterDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/concurrency/IntelligentRecognitionProcess.py" beforeDir="false" afterPath="$PROJECT_DIR$/concurrency/IntelligentRecognitionProcess.py" afterDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/dsp_application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/dsp_application.yml" afterDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/enums/ExceptionEnum.py" beforeDir="false" afterPath="$PROJECT_DIR$/enums/ExceptionEnum.py" afterDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/enums/ModelTypeEnum.py" beforeDir="false" afterPath="$PROJECT_DIR$/enums/ModelTypeEnum.py" afterDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/test/image/1.jpg" beforeDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/test/image/11.jpg" beforeDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/test/image/2.jpg" beforeDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/test/image/22.jpg" beforeDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/util/AliyunSdk.py" beforeDir="false" afterPath="$PROJECT_DIR$/util/AliyunSdk.py" afterDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/util/Cv2Utils.py" beforeDir="false" afterPath="$PROJECT_DIR$/util/Cv2Utils.py" afterDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/util/ImageUtils.py" beforeDir="false" afterPath="$PROJECT_DIR$/util/ImageUtils.py" afterDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/util/ModelUtils.py" beforeDir="false" afterPath="$PROJECT_DIR$/util/ModelUtils.py" afterDir="false" /> | |||
<change beforePath="$PROJECT_DIR$/util/OcrBaiduSdk.py" beforeDir="false" afterPath="$PROJECT_DIR$/util/OcrBaiduSdk.py" afterDir="false" /> | |||
</list> | |||
<option name="SHOW_DIALOG" value="false" /> | |||
<option name="HIGHLIGHT_CONFLICTS" value="true" /> | |||
@@ -132,7 +145,7 @@ | |||
<property name="WebServerToolWindowPanel.toolwindow.show.date" value="false" /> | |||
<property name="WebServerToolWindowPanel.toolwindow.show.permissions" value="false" /> | |||
<property name="WebServerToolWindowPanel.toolwindow.show.size" value="false" /> | |||
<property name="last_opened_file_path" value="$PROJECT_DIR$" /> | |||
<property name="last_opened_file_path" value="$PROJECT_DIR$/../../code/dsp/tuoheng_dsp" /> | |||
<property name="node.js.detected.package.eslint" value="true" /> | |||
<property name="node.js.detected.package.tslint" value="true" /> | |||
<property name="node.js.selected.package.eslint" value="(autodetect)" /> | |||
@@ -146,32 +159,33 @@ | |||
</component> | |||
<component name="RecentsManager"> | |||
<key name="CopyFile.RECENT_KEYS"> | |||
<recent name="D:\work\alg_new\tuoheng_alg\test\ffmpeg11" /> | |||
<recent name="D:\work\alg_new\tuoheng_alg\enums" /> | |||
<recent name="D:\work\alg_new\tuoheng_alg\util" /> | |||
<recent name="D:\work\alg_new\tuoheng_alg\test\ffmpeg11" /> | |||
<recent name="D:\work\alg\tuoheng_alg\test\ffmpeg11" /> | |||
<recent name="D:\work\alg\tuoheng_alg\data" /> | |||
<recent name="D:\work\alg\tuoheng_alg\test" /> | |||
</key> | |||
<key name="MoveFile.RECENT_KEYS"> | |||
<recent name="D:\work\alg_new\tuoheng_alg\test\image" /> | |||
<recent name="D:\work\alg\tuoheng_alg\test\水印" /> | |||
<recent name="D:\work\alg\tuoheng_alg\image" /> | |||
</key> | |||
</component> | |||
<component name="RunManager" selected="Python.ffmpeg13"> | |||
<configuration name="aa" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> | |||
<component name="RunManager" selected="Python.ImgBaiduSdk"> | |||
<configuration name="ImgBaiduSdk" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> | |||
<module name="tuoheng_alg" /> | |||
<option name="INTERPRETER_OPTIONS" value="" /> | |||
<option name="PARENT_ENVS" value="true" /> | |||
<envs> | |||
<env name="PYTHONUNBUFFERED" value="1" /> | |||
</envs> | |||
<option name="SDK_HOME" value="sftp://dell@192.168.10.12:22/home/dell/anaconda3/envs/prod/bin/python3.8" /> | |||
<option name="WORKING_DIRECTORY" value="/home/chenyukun/algSch/test/ffmpeg11" /> | |||
<option name="SDK_HOME" value="$PROJECT_DIR$/../../../software/anaconda/envs/test/python.exe" /> | |||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/util" /> | |||
<option name="IS_MODULE_SDK" value="false" /> | |||
<option name="ADD_CONTENT_ROOTS" value="true" /> | |||
<option name="ADD_SOURCE_ROOTS" value="true" /> | |||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> | |||
<option name="SCRIPT_NAME" value="/home/chenyukun/algSch/test/ffmpeg11/aa.py" /> | |||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/util/ImgBaiduSdk.py" /> | |||
<option name="PARAMETERS" value="" /> | |||
<option name="SHOW_COMMAND_LINE" value="false" /> | |||
<option name="EMULATE_TERMINAL" value="false" /> | |||
@@ -180,20 +194,20 @@ | |||
<option name="INPUT_FILE" value="" /> | |||
<method v="2" /> | |||
</configuration> | |||
<configuration name="ffmpeg12" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> | |||
<configuration name="editImage" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true"> | |||
<module name="tuoheng_alg" /> | |||
<option name="INTERPRETER_OPTIONS" value="" /> | |||
<option name="PARENT_ENVS" value="true" /> | |||
<envs> | |||
<env name="PYTHONUNBUFFERED" value="1" /> | |||
</envs> | |||
<option name="SDK_HOME" value="D:\software\anaconda\envs\chenyukun\python.exe" /> | |||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test/ffmpeg11" /> | |||
<option name="SDK_HOME" value="$PROJECT_DIR$/../../../software/anaconda/envs/test/python.exe" /> | |||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test/editimage" /> | |||
<option name="IS_MODULE_SDK" value="false" /> | |||
<option name="ADD_CONTENT_ROOTS" value="true" /> | |||
<option name="ADD_SOURCE_ROOTS" value="true" /> | |||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> | |||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/ffmpeg11/ffmpeg12.py" /> | |||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/editimage/editImage.py" /> | |||
<option name="PARAMETERS" value="" /> | |||
<option name="SHOW_COMMAND_LINE" value="false" /> | |||
<option name="EMULATE_TERMINAL" value="false" /> | |||
@@ -202,7 +216,7 @@ | |||
<option name="INPUT_FILE" value="" /> | |||
<method v="2" /> | |||
</configuration> | |||
<configuration name="ffmpeg13" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> | |||
<configuration name="ffmpeg12" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> | |||
<module name="tuoheng_alg" /> | |||
<option name="INTERPRETER_OPTIONS" value="" /> | |||
<option name="PARENT_ENVS" value="true" /> | |||
@@ -215,7 +229,7 @@ | |||
<option name="ADD_CONTENT_ROOTS" value="true" /> | |||
<option name="ADD_SOURCE_ROOTS" value="true" /> | |||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> | |||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/ffmpeg11/ffmpeg13.py" /> | |||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/ffmpeg11/ffmpeg12.py" /> | |||
<option name="PARAMETERS" value="" /> | |||
<option name="SHOW_COMMAND_LINE" value="false" /> | |||
<option name="EMULATE_TERMINAL" value="false" /> | |||
@@ -224,20 +238,20 @@ | |||
<option name="INPUT_FILE" value="" /> | |||
<method v="2" /> | |||
</configuration> | |||
<configuration name="mysqltest" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true"> | |||
<configuration name="ffmpeg13" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> | |||
<module name="tuoheng_alg" /> | |||
<option name="INTERPRETER_OPTIONS" value="" /> | |||
<option name="PARENT_ENVS" value="true" /> | |||
<envs> | |||
<env name="PYTHONUNBUFFERED" value="1" /> | |||
</envs> | |||
<option name="SDK_HOME" value="" /> | |||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test" /> | |||
<option name="IS_MODULE_SDK" value="true" /> | |||
<option name="SDK_HOME" value="D:\software\anaconda\envs\chenyukun\python.exe" /> | |||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test/ffmpeg11" /> | |||
<option name="IS_MODULE_SDK" value="false" /> | |||
<option name="ADD_CONTENT_ROOTS" value="true" /> | |||
<option name="ADD_SOURCE_ROOTS" value="true" /> | |||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> | |||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/mysqltest.py" /> | |||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/ffmpeg11/ffmpeg13.py" /> | |||
<option name="PARAMETERS" value="" /> | |||
<option name="SHOW_COMMAND_LINE" value="false" /> | |||
<option name="EMULATE_TERMINAL" value="false" /> | |||
@@ -246,20 +260,20 @@ | |||
<option name="INPUT_FILE" value="" /> | |||
<method v="2" /> | |||
</configuration> | |||
<configuration name="producer_start1" type="PythonConfigurationType" factoryName="Python" temporary="true"> | |||
<configuration name="mysqltest" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true"> | |||
<module name="tuoheng_alg" /> | |||
<option name="INTERPRETER_OPTIONS" value="" /> | |||
<option name="PARENT_ENVS" value="true" /> | |||
<envs> | |||
<env name="PYTHONUNBUFFERED" value="1" /> | |||
</envs> | |||
<option name="SDK_HOME" value="$PROJECT_DIR$/../../../software/anaconda/envs/test/python.exe" /> | |||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test/kafka" /> | |||
<option name="IS_MODULE_SDK" value="false" /> | |||
<option name="SDK_HOME" value="" /> | |||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test" /> | |||
<option name="IS_MODULE_SDK" value="true" /> | |||
<option name="ADD_CONTENT_ROOTS" value="true" /> | |||
<option name="ADD_SOURCE_ROOTS" value="true" /> | |||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> | |||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/kafka/producer_start.py" /> | |||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/mysqltest.py" /> | |||
<option name="PARAMETERS" value="" /> | |||
<option name="SHOW_COMMAND_LINE" value="false" /> | |||
<option name="EMULATE_TERMINAL" value="false" /> | |||
@@ -291,20 +305,19 @@ | |||
<method v="2" /> | |||
</configuration> | |||
<list> | |||
<item itemvalue="Python.editImage" /> | |||
<item itemvalue="Python.mysqltest" /> | |||
<item itemvalue="Python.aa" /> | |||
<item itemvalue="Python.producer_start1" /> | |||
<item itemvalue="Python.test" /> | |||
<item itemvalue="Python.ffmpeg12" /> | |||
<item itemvalue="Python.ffmpeg13" /> | |||
<item itemvalue="Python.ImgBaiduSdk" /> | |||
</list> | |||
<recent_temporary> | |||
<list> | |||
<item itemvalue="Python.ImgBaiduSdk" /> | |||
<item itemvalue="Python.ffmpeg13" /> | |||
<item itemvalue="Python.ffmpeg12" /> | |||
<item itemvalue="Python.test" /> | |||
<item itemvalue="Python.producer_start1" /> | |||
<item itemvalue="Python.aa" /> | |||
</list> | |||
</recent_temporary> | |||
</component> | |||
@@ -409,6 +422,8 @@ | |||
<workItem from="1677632498068" duration="4279000" /> | |||
<workItem from="1677654510460" duration="2082000" /> | |||
<workItem from="1677727307545" duration="438000" /> | |||
<workItem from="1678153491396" duration="9573000" /> | |||
<workItem from="1678253386456" duration="45394000" /> | |||
</task> | |||
<servers /> | |||
</component> | |||
@@ -450,8 +465,10 @@ | |||
<component name="com.intellij.coverage.CoverageDataManagerImpl"> | |||
<SUITE FILE_PATH="coverage/tuoheng_alg$cv2test1__1_.coverage" NAME="cv2test1 覆盖结果" MODIFIED="1665820653649" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test" /> | |||
<SUITE FILE_PATH="coverage/tuoheng_alg$test.coverage" NAME="test 覆盖结果" MODIFIED="1675048794635" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test/str" /> | |||
<SUITE FILE_PATH="coverage/tuoheng_alg$ImgBaiduSdk.coverage" NAME="ImgBaiduSdk 覆盖结果" MODIFIED="1678355024003" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/util" /> | |||
<SUITE FILE_PATH="coverage/tuoheng_alg$mysqltest.coverage" NAME="mysqltest Coverage Results" MODIFIED="1660868712851" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test" /> | |||
<SUITE FILE_PATH="coverage/tuoheng_alg$ffmpeg33.coverage" NAME="ffmpeg33 覆盖结果" MODIFIED="1670489109246" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test/ffmpeg11" /> | |||
<SUITE FILE_PATH="coverage/tuoheng_alg$editImage.coverage" NAME="editImage 覆盖结果" MODIFIED="1678348350574" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test/editimage" /> | |||
<SUITE FILE_PATH="coverage/tuoheng_alg$asnyc.coverage" NAME="asnyc Coverage Results" MODIFIED="1663459033435" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test" /> | |||
<SUITE FILE_PATH="coverage/tuoheng_alg$asnyc__1_.coverage" NAME="asnyc (1) Coverage Results" MODIFIED="1663458917599" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test" /> | |||
<SUITE FILE_PATH="coverage/tuoheng_alg$1.coverage" NAME="协程1 覆盖结果" MODIFIED="1667866542122" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test/协程" /> |
@@ -1,26 +1,29 @@ | |||
# -*- coding: utf-8 -*- | |||
import asyncio | |||
import base64 | |||
import json | |||
import os | |||
import sys | |||
import time | |||
import copy | |||
from concurrent.futures import ThreadPoolExecutor, as_completed | |||
import cv2 | |||
import numpy as np | |||
from PIL import Image, ImageDraw, ImageFont | |||
from common import Constant | |||
from multiprocessing import Process, Queue | |||
from loguru import logger | |||
from concurrency.FileUpdateThread import build_image_name | |||
from concurrency.HeartbeatThread import Heartbeat | |||
from concurrency.PullVideoStreamProcess import OnlinePullVideoStreamProcess, OfflinePullVideoStreamProcess | |||
from entity import FeedBack | |||
from enums.AnalysisStatusEnum import AnalysisStatus | |||
from enums.AnalysisTypeEnum import AnalysisType | |||
from enums.ExceptionEnum import ExceptionType | |||
from enums.ModelTypeEnum import ModelType | |||
from util import LogUtils, TimeUtils, ImageUtils, ModelUtils | |||
from util import LogUtils, TimeUtils, ImageUtils | |||
from util.AliyunSdk import AliyunOssSdk | |||
from util.Cv2Utils import Cv2Util | |||
from entity.FeedBack import message_feedback | |||
@@ -29,7 +32,11 @@ from concurrency.CommonThread import Common | |||
from exception.CustomerException import ServiceException | |||
from util.ImageUtils import PictureWaterMark, url2Array | |||
from util.OcrBaiduSdk import OcrBaiduSdk | |||
from util.ModelUtils import MODEL_CONFIG | |||
from enums.BaiduSdkEnum import VehicleEnumVALUE | |||
from enums.ModelTypeEnum import BaiduModelTarget | |||
sys.path.extend(['..', '../font']) | |||
class IntelligentRecognitionProcess(Process): | |||
def __init__(self, cfg): | |||
@@ -151,9 +158,8 @@ class OnlineIntelligentRecognitionProcess(IntelligentRecognitionProcess): | |||
pullProcess.sendCommand({"command": "stop_pull_stream"}) | |||
if not os.path.exists(self.orFilePath) or not os.path.exists(self.aiFilePath): | |||
logger.error("原视频或AI视频不存在!requestId:{}", self.msg.get("request_id")) | |||
raise ServiceException(ExceptionType.VIDEO_ADDRESS_EXCEPTION.value[0], | |||
ExceptionType.VIDEO_ADDRESS_EXCEPTION.value[1]) | |||
raise ServiceException(ExceptionType.PUSH_STREAM_TIME_EXCEPTION.value[0], | |||
ExceptionType.PUSH_STREAM_TIME_EXCEPTION.value[1]) | |||
params1 = (self.orFilePath, "orOnLineVideo", self.content, logger, self.msg.get("request_id")) | |||
or_update_thread = Common(content=self.content, func=AliyunSdk.get_play_url, args=params1) | |||
params2 = (self.aiFilePath, "aiOnLineVideo", self.content, logger, self.msg.get("request_id")) | |||
@@ -187,9 +193,11 @@ class OnlineIntelligentRecognitionProcess(IntelligentRecognitionProcess): | |||
# 程序开始时间 | |||
LogUtils.init_log(self.content) | |||
self.sendhbMessage(AnalysisStatus.WAITING.value, "0.0000", AnalysisType.ONLINE.value) | |||
mod, model_type_code = get_model((str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id"))) | |||
mod, model_type_code = get_model( | |||
(str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id"), self.content)) | |||
# 结果反馈进程启动 | |||
pullProcess = OnlinePullVideoStreamProcess(self.msg, self.content, self.pullQueue, self.fbQueue, self.hbQueue, | |||
pullProcess = OnlinePullVideoStreamProcess(self.msg, self.content, self.pullQueue, self.fbQueue, | |||
self.hbQueue, | |||
self.imageQueue) | |||
pullProcess.daemon = True | |||
pullProcess.start() | |||
@@ -246,8 +254,8 @@ class OnlineIntelligentRecognitionProcess(IntelligentRecognitionProcess): | |||
if r[1] is None or not r[1]: | |||
t.shutdown(wait=False) | |||
loop.close() | |||
raise ServiceException(ExceptionType.WRITE_STREAM_EXCEPTION.value[0], | |||
ExceptionType.WRITE_STREAM_EXCEPTION.value[1]) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
if p_result[2] is not None and len(p_result[2]) > 0: | |||
for ai_analyse_result in p_result[2]: | |||
order = str(int(ai_analyse_result[0])) | |||
@@ -469,8 +477,8 @@ class OfflineIntelligentRecognitionProcess(IntelligentRecognitionProcess): | |||
pullProcess.sendCommand({"command": "stop_pull_stream"}) | |||
if not os.path.exists(self.aiFilePath): | |||
logger.error("AI视频不存在!requestId:{}", self.msg.get("request_id")) | |||
raise ServiceException(ExceptionType.VIDEO_ADDRESS_EXCEPTION.value[0], | |||
ExceptionType.VIDEO_ADDRESS_EXCEPTION.value[1]) | |||
raise ServiceException(ExceptionType.PUSH_STREAM_TIME_EXCEPTION.value[0], | |||
ExceptionType.PUSH_STREAM_TIME_EXCEPTION.value[1]) | |||
params2 = (self.aiFilePath, "aiOffLineVideo", self.content, logger, self.msg.get("request_id")) | |||
ai_update_thread = Common(content=self.content, func=AliyunSdk.get_play_url, args=params2) | |||
ai_update_thread.setDaemon(True) | |||
@@ -498,8 +506,10 @@ class OfflineIntelligentRecognitionProcess(IntelligentRecognitionProcess): | |||
# 程序开始时间 | |||
LogUtils.init_log(self.content) | |||
self.sendhbMessage(AnalysisStatus.WAITING.value, "0.0000", AnalysisType.OFFLINE.value) | |||
mod, model_type_code = get_model((str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id"))) | |||
pullProcess = OfflinePullVideoStreamProcess(self.msg, self.content, self.pullQueue, self.fbQueue, self.hbQueue, | |||
mod, model_type_code = get_model( | |||
(str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id"), self.content)) | |||
pullProcess = OfflinePullVideoStreamProcess(self.msg, self.content, self.pullQueue, self.fbQueue, | |||
self.hbQueue, | |||
self.imageQueue) | |||
pullProcess.daemon = True | |||
pullProcess.start() | |||
@@ -559,9 +569,10 @@ class OfflineIntelligentRecognitionProcess(IntelligentRecognitionProcess): | |||
if r[1] is None or not r[1]: | |||
t.shutdown(wait=False) | |||
loop.close() | |||
raise ServiceException(ExceptionType.WRITE_STREAM_EXCEPTION.value[0], | |||
ExceptionType.WRITE_STREAM_EXCEPTION.value[1]) | |||
if frame_all[0].get("cct_frame") % 600 == 0 and float(frame_all[0].get("cct_frame")) <= float(frame_all[0].get("all_frame")): | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
if frame_all[0].get("cct_frame") % 600 == 0 and float( | |||
frame_all[0].get("cct_frame")) <= float(frame_all[0].get("all_frame")): | |||
task_process = str(format( | |||
float(frame_all[0].get("cct_frame")) / float(frame_all[0].get("all_frame")), | |||
'.4f')) | |||
@@ -758,25 +769,26 @@ def image_recognition(imageUrl, mod, content, pic, msg, fbQueue, model_type_code | |||
# logger.info("算法模型调度时间:{}s, requestId:{}", time.time() - time00, self.msg.get("request_id")) | |||
# 原视频保存本地、AI视频保存本地 | |||
if content["video"]["video_add_water"]: | |||
frame = pic.common_water_1(image, pic.logo) | |||
# frame = pic.common_water_1(image, pic.logo) | |||
p_result[1] = pic.common_water_1(p_result[1], pic.logo) | |||
aliyunOssSdk = AliyunOssSdk(content, logger, msg.get("request_id")) | |||
aliyunOssSdk.get_oss_bucket() | |||
loop = asyncio.new_event_loop() | |||
asyncio.set_event_loop(loop) | |||
or_image = cv2.imencode(".jpg", frame)[1] | |||
# or_image = cv2.imencode(".jpg", frame)[1] | |||
ai_image = cv2.imencode(".jpg", p_result[1])[1] | |||
# 定义上传图片名称 | |||
random_num = TimeUtils.now_date_to_str(TimeUtils.YMDHMSF) | |||
time_now = TimeUtils.now_date_to_str("%Y-%m-%d-%H-%M-%S") | |||
if p_result[2] is not None and len(p_result[2]) > 0: | |||
# 图片名称待后期修改 | |||
or_image_name = build_image_name(msg.get('results_base_dir'), time_now, str(0), str(0), random_num, | |||
'image', msg.get('request_id'), "OR") | |||
# or_image_name = build_image_name(msg.get('results_base_dir'), time_now, str(0), str(0), random_num, | |||
# 'image', msg.get('request_id'), "OR") | |||
ai_image_name = build_image_name(msg.get('results_base_dir'), time_now, | |||
str(0), str(0), random_num, 'image', msg.get('request_id'), "AI") | |||
loop.run_until_complete(asyncio.wait([upload_file(aliyunOssSdk, or_image_name, or_image), | |||
upload_file(aliyunOssSdk, ai_image_name, ai_image)])) | |||
# loop.run_until_complete(asyncio.wait([upload_file(aliyunOssSdk, or_image_name, or_image), | |||
# upload_file(aliyunOssSdk, ai_image_name, ai_image)])) | |||
loop.run_until_complete(asyncio.wait([upload_file(aliyunOssSdk, ai_image_name, ai_image)])) | |||
order = [] | |||
for ai_analyse_result in p_result[2]: | |||
order.append(str(int(ai_analyse_result[0]))) | |||
@@ -785,7 +797,8 @@ def image_recognition(imageUrl, mod, content, pic, msg, fbQueue, model_type_code | |||
AnalysisStatus.RUNNING.value, | |||
AnalysisType.IMAGE.value, "", "", | |||
'', | |||
or_image_name, | |||
# or_image_name, | |||
imageUrl, | |||
ai_image_name, | |||
model_type_code, | |||
",".join(set(order)), | |||
@@ -835,7 +848,7 @@ def epidemic_prevention(imageUrl, mod, content, orc, msg, fbQueue, model_type_co | |||
else: | |||
carCode = result.get("words_result").get("number") | |||
if len(carCode) > 0: | |||
plate_result = {'type': str(3), 'carUrl': imageUrl, 'carCode': carCode, 'score': score} | |||
plate_result = {'type': str(3), 'modelCode': model_type_code, 'carUrl': imageUrl, 'carCode': carCode, 'score': score} | |||
fbQueue.put({"feedback": FeedBack.message_feedback(msg.get('request_id'), | |||
AnalysisStatus.RUNNING.value, | |||
AnalysisType.IMAGE.value, "", "", | |||
@@ -876,6 +889,7 @@ def epidemic_prevention(imageUrl, mod, content, orc, msg, fbQueue, model_type_co | |||
cityRecognition = city.get("words_result") | |||
if len(phoneNumberRecognition) > 0 or len(cityRecognition) > 0: | |||
trip_result = {'type': str(1), | |||
'modelCode': model_type_code, | |||
'imageUrl': imageUrl, | |||
'phoneNumberRecognition': phoneNumberRecognition, | |||
'phone_sorce': phone_score, | |||
@@ -929,6 +943,7 @@ def epidemic_prevention(imageUrl, mod, content, orc, msg, fbQueue, model_type_co | |||
hsRecognition = hs.get("words_result") | |||
if len(nameRecognition) > 0 or len(phoneNumberRecognition) > 0 or len(hsRecognition) > 0: | |||
healthy_result = {'type': str(2), | |||
'modelCode': model_type_code, | |||
'imageUrl': imageUrl, | |||
'color': dataBack.get("color"), | |||
'nameRecognition': nameRecognition, | |||
@@ -953,6 +968,134 @@ def epidemic_prevention(imageUrl, mod, content, orc, msg, fbQueue, model_type_co | |||
logger.exception("模型分析异常: {}, requestId: {}", e, msg.get("request_id")) | |||
return False | |||
def mark(content, info, img, color): | |||
# score = info.get("probability") | |||
# if score is None: | |||
# score = info.get("location").get("score") | |||
# text = "%s: %.2f]" % (content, score) | |||
# text_xy = (info.get("location").get("left"), info.get("location").get("top") - 30) | |||
img_lu = (info.get("location").get("left"), info.get("location").get("top")) | |||
img_rd = (info.get("location").get("left") + info.get("location").get("width"), | |||
info.get("location").get("top") + info.get("location").get("height")) | |||
# cv2.putText(img, text, text_xy, cv2.FONT_HERSHEY_SIMPLEX, 1.0, color, 1, cv2.LINE_AA) | |||
count = 1 | |||
if img.shape[1] > 1600: | |||
count = 2 | |||
cv2.rectangle(img, img_lu, img_rd, color, count) | |||
return img | |||
def baidu_recognition(imageUrl, mod, msg, content, fbQueue, model_type_code): | |||
try: | |||
# 检查检测目标 | |||
if mod.allowedList is None or len(mod.allowedList) == 0: | |||
return True | |||
img = url2Array(imageUrl) | |||
aliyunOssSdk = AliyunOssSdk(content, logger, msg.get('request_id')) | |||
aliyunOssSdk.get_oss_bucket() | |||
for target in mod.allowedList: | |||
result = mod.process(target, imageUrl) | |||
if target == BaiduModelTarget.VEHICLE_DETECTION.value[1] and result is not None: | |||
vehicleInfo = result.get("vehicle_info") | |||
if vehicleInfo is not None and len(vehicleInfo) > 0: | |||
aiIamge = None | |||
for i, info in enumerate(vehicleInfo): | |||
value = VehicleEnumVALUE.get(info.get("type")) | |||
if value is None: | |||
logger.error("车辆识别出现未支持的目标类型!type:{}, requestId:{}", info.get("type"), msg.get('request_id')) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
aiIamge = mark("["+str(i) + "][" + value.value[1], info, img, (255, 0, 255)) | |||
info["id"] = str(i) | |||
if aiIamge is not None and len(aiIamge) > 0: | |||
random_num = TimeUtils.now_date_to_str(TimeUtils.YMDHMSF) | |||
time_now = TimeUtils.now_date_to_str("%Y-%m-%d-%H-%M-%S") | |||
ai_image_name = build_image_name(msg.get('results_base_dir'), time_now, | |||
str(0), | |||
str(0), | |||
random_num, | |||
AnalysisType.IMAGE.value, | |||
msg.get('request_id'), "AI") | |||
ai_result, ai_image = cv2.imencode(".jpg", aiIamge) | |||
aliyunOssSdk.sync_upload_file(ai_image_name, ai_image.tobytes()) | |||
result["type"] = str(target) | |||
result["modelCode"] = model_type_code | |||
fbQueue.put({"feedback": FeedBack.message_feedback(msg.get('request_id'), | |||
AnalysisStatus.RUNNING.value, | |||
AnalysisType.IMAGE.value, "", "", | |||
'', | |||
imageUrl, | |||
ai_image_name, | |||
model_type_code, | |||
str(target), | |||
TimeUtils.now_date_to_str(), | |||
json.dumps(result))}) | |||
# 人体识别 | |||
if target == BaiduModelTarget.HUMAN_DETECTION.value[1] and result is not None: | |||
personInfo = result.get("person_info") | |||
personNum = result.get("person_num") | |||
if personNum is not None and personNum > 0 and personInfo is not None and len(personInfo) > 0: | |||
personImage = None | |||
for i, info in enumerate(personInfo): | |||
personImage = mark("[" + str(i) + "][人", info, img, (255, 0, 0)) | |||
info["id"] = str(i) | |||
if personImage is not None and len(personImage) > 0: | |||
random_num = TimeUtils.now_date_to_str(TimeUtils.YMDHMSF) | |||
time_now = TimeUtils.now_date_to_str("%Y-%m-%d-%H-%M-%S") | |||
ai_image_name = build_image_name(msg.get('results_base_dir'), time_now, | |||
str(0), | |||
str(0), | |||
random_num, | |||
AnalysisType.IMAGE.value, | |||
msg.get('request_id'), "AI") | |||
ai_result, ai_image = cv2.imencode(".jpg", personImage) | |||
aliyunOssSdk.sync_upload_file(ai_image_name, ai_image.tobytes()) | |||
result["type"] = str(target) | |||
result["modelCode"] = model_type_code | |||
fbQueue.put({"feedback": FeedBack.message_feedback(msg.get('request_id'), | |||
AnalysisStatus.RUNNING.value, | |||
AnalysisType.IMAGE.value, "", "", | |||
'', | |||
imageUrl, | |||
ai_image_name, | |||
model_type_code, | |||
str(target), | |||
TimeUtils.now_date_to_str(), | |||
json.dumps(result))}) | |||
# 人流量 | |||
if target == BaiduModelTarget.PEOPLE_COUNTING.value[1] and result is not None: | |||
base64Image = result.get("image") | |||
if base64Image is not None and len(base64Image) > 0: | |||
baiduImage = base64.b64decode(base64Image) | |||
random_num = TimeUtils.now_date_to_str(TimeUtils.YMDHMSF) | |||
time_now = TimeUtils.now_date_to_str("%Y-%m-%d-%H-%M-%S") | |||
ai_image_name = build_image_name(msg.get('results_base_dir'), time_now, | |||
str(0), | |||
str(0), | |||
random_num, | |||
AnalysisType.IMAGE.value, | |||
msg.get('request_id'), "AI") | |||
aliyunOssSdk.sync_upload_file(ai_image_name, baiduImage) | |||
result["type"] = str(target) | |||
result["modelCode"] = model_type_code | |||
del result["image"] | |||
fbQueue.put({"feedback": FeedBack.message_feedback(msg.get('request_id'), | |||
AnalysisStatus.RUNNING.value, | |||
AnalysisType.IMAGE.value, "", "", | |||
'', | |||
imageUrl, | |||
ai_image_name, | |||
model_type_code, | |||
str(target), | |||
TimeUtils.now_date_to_str(), | |||
json.dumps(result))}) | |||
logger.info("算法分析结果: {}", result) | |||
return True | |||
except Exception as e: | |||
logger.exception("百度AI分析异常: {}, requestId: {}", e, msg.get("request_id")) | |||
return False | |||
''' | |||
图片识别 | |||
@@ -990,6 +1133,19 @@ class PhotosIntelligentRecognitionProcess(IntelligentRecognitionProcess): | |||
result = False | |||
return result | |||
def baiduRecognition(self, imageUrls, mod, model_type_code): | |||
result = True | |||
with ThreadPoolExecutor(max_workers=5) as t: | |||
obj_list = [] | |||
for imageUrl in imageUrls: | |||
obj = t.submit(baidu_recognition, imageUrl, mod, self.msg, self.content, self.fbQueue, model_type_code) | |||
obj_list.append(obj) | |||
for future in as_completed(obj_list): | |||
data = future.result() | |||
if not data: | |||
result = False | |||
return result | |||
def run(self): | |||
try: | |||
# 初始化日志 | |||
@@ -1000,11 +1156,15 @@ class PhotosIntelligentRecognitionProcess(IntelligentRecognitionProcess): | |||
AnalysisType.IMAGE.value, | |||
progress='0.0000', | |||
analyse_time=TimeUtils.now_date_to_str())}) | |||
# 加载模型 | |||
mod, model_type_code = get_model((str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id"))) | |||
mod, model_type_code = get_model( | |||
(str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id"), self.content)) | |||
# 获取所有图片信息 | |||
imageUrls = self.msg.get("image_urls") | |||
if model_type_code == ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]: | |||
if model_type_code == ModelType.BAIDU_MODEL.value[1]: | |||
result = self.baiduRecognition(imageUrls, mod, model_type_code) | |||
elif model_type_code == ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]: | |||
result = self.epidemicPrevention(imageUrls, mod, model_type_code) | |||
elif model_type_code == ModelType.PLATE_MODEL.value[1]: | |||
result = self.epidemicPrevention(imageUrls, mod, model_type_code) | |||
@@ -1054,43 +1214,19 @@ class PhotosIntelligentRecognitionProcess(IntelligentRecognitionProcess): | |||
def get_model(args): | |||
logger.info("######################开始加载模型######################") | |||
model_config = { | |||
# 加载河道模型 | |||
ModelType.WATER_SURFACE_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.WATER_SURFACE_MODEL), ModelType.WATER_SURFACE_MODEL.value[1]), | |||
# 加载林场模型 | |||
ModelType.FOREST_FARM_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.FOREST_FARM_MODEL), ModelType.FOREST_FARM_MODEL.value[1]), | |||
# 加载交通模型 | |||
ModelType.TRAFFIC_FARM_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.TRAFFIC_FARM_MODEL), ModelType.TRAFFIC_FARM_MODEL.value[1]), | |||
# 加载防疫模型 | |||
ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.IMModel(x, y, z, r, ModelType.EPIDEMIC_PREVENTION_MODEL), ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]), | |||
# 加载车牌模型 | |||
ModelType.PLATE_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.IMModel(x, y, z, r, ModelType.PLATE_MODEL), ModelType.PLATE_MODEL.value[1]), | |||
# 加载车辆模型 | |||
ModelType.VEHICLE_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.VEHICLE_MODEL), ModelType.VEHICLE_MODEL.value[1]), | |||
# 加载行人模型 | |||
ModelType.PEDESTRIAN_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.PEDESTRIAN_MODEL), ModelType.PEDESTRIAN_MODEL.value[1]), | |||
# 加载烟火模型 | |||
ModelType.SMOGFIRE_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.SMOGFIRE_MODEL), ModelType.SMOGFIRE_MODEL.value[1]), | |||
# 加载钓鱼游泳模型 | |||
ModelType.ANGLERSWIMMER_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.ANGLERSWIMMER_MODEL), ModelType.ANGLERSWIMMER_MODEL.value[1]), | |||
# 加载乡村模型 | |||
ModelType.COUNTRYROAD_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.COUNTRYROAD_MODEL), ModelType.COUNTRYROAD_MODEL.value[1]), | |||
# 加载船只模型 | |||
ModelType.SHIP_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.SHIP_MODEL), ModelType.SHIP_MODEL.value[1]) | |||
} | |||
for model in args[1]: | |||
try: | |||
code = model.get("code") | |||
needed_objectsIndex = [int(category.get("id")) for category in model.get("categories")] | |||
logger.info("code:{}, 检查目标:{}, gpuId:{}", code, needed_objectsIndex, args[0]) | |||
model_method = model_config.get(code) | |||
model_method = MODEL_CONFIG.get(code) | |||
if model_method is not None: | |||
return model_method[0](args[0], needed_objectsIndex, logger, args[2]), model_method[1] | |||
return model_method[0](args[0], needed_objectsIndex, logger, args[2], args[3]), model_method[1] | |||
else: | |||
logger.error("未匹配到对应的模型") | |||
raise ServiceException(ExceptionType.AI_MODEL_MATCH_EXCEPTION.value[0], | |||
ExceptionType.AI_MODEL_MATCH_EXCEPTION.value[1]) | |||
except Exception as e: | |||
logger.exception("获取模型配置异常: {}", e) | |||
raise ServiceException(ExceptionType.AI_MODEL_CONFIG_EXCEPTION.value[0], | |||
ExceptionType.AI_MODEL_CONFIG_EXCEPTION.value[1]) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) |
@@ -134,10 +134,22 @@ service: | |||
timeout: 21600 # 一次识别任务超时时间,单位秒,默认6个小时 | |||
cv2_pull_stream_timeout: 3600 # 直播开始视频未推流超时时间 | |||
cv2_read_stream_timeout: 1800 # 直播读流中超时时间 | |||
baiduocr: | |||
APP_ID: 28173504 | |||
API_KEY: kqrFE7VuygIaFer7z6cRxzoi | |||
SECRET_KEY: yp7xBokyl4TItyGhay7skAN1cMwfvEXf | |||
baidu: | |||
orc: | |||
APP_ID: 28173504 | |||
API_KEY: kqrFE7VuygIaFer7z6cRxzoi | |||
SECRET_KEY: yp7xBokyl4TItyGhay7skAN1cMwfvEXf | |||
# 车辆检测 | |||
vehicle: | |||
APP_ID: 31096670 | |||
API_KEY: Dam3O4tgPRN3qh4OYE82dbg7 | |||
SECRET_KEY: 1PGZ9LAXRR5zcT5MN9rHcW8kLBIS5DAa | |||
# 人 | |||
person: | |||
APP_ID: 31096755 | |||
API_KEY: CiWrt4iyxOly36n3kR7utiAG | |||
SECRET_KEY: K7y6V3XTGdyXvgtCNCwTGUEooxxDuX9v | |||
# 日志设置 | |||
log: | |||
# 是否开启文件输出 True:开启 False:关闭 |
@@ -0,0 +1,175 @@ | |||
from enum import Enum, unique | |||
''' | |||
官方文档: https://ai.baidu.com/ai-doc/VEHICLE/rk3inf9tj | |||
参数1: 异常编号 | |||
参数2: 异常英文描述 | |||
参数3: 异常中文描述 | |||
参数4: 0-异常信息统一输出为内部异常 | |||
1-异常信息可以输出 | |||
2-输出空的异常信息 | |||
参数5: 指定异常重试的次数 | |||
''' | |||
# 异常枚举 | |||
@unique | |||
class BaiduSdkErrorEnum(Enum): | |||
UNKNOWN_ERROR = (1, "Unknown error", "未知错误", 0, 0) | |||
SERVICE_TEMPORARILY_UNAVAILABLE = (2, "Service temporarily unavailable", "服务暂不可用,请再次请求", 0, 3) | |||
UNSUPPORTED_OPENAPI_METHOD = (3, "Unsupported openapi method", "调用的API不存在", 0, 0) | |||
API_REQUEST_LIMIT_REACHED = (4, "Open api request limit reached", "请求量限制, 请稍后再试!", 1, 5) | |||
NO_PERMISSION_TO_ACCESS_DATA = (6, "No permission to access data", "无权限访问该用户数据", 1, 0) | |||
GET_SERVICE_TOKEN_FAILED = (13, "Get service token failed", "获取token失败", 0, 2) | |||
IAM_CERTIFICATION_FAILED = (14, "IAM Certification failed", "IAM 鉴权失败", 0, 2) | |||
APP_NOT_EXSITS_OR_CREATE_FAILED = (15, "app not exsits or create failed", "应用不存在或者创建失败", 0, 0) | |||
API_DAILY_REQUEST_LIMIT_REACHED = (17, "Open api daily request limit reached", "每天请求量超限额!", 1, 5) | |||
API_QPS_REQUEST_LIMIT_REACHED = (18, "Open api qps request limit reached", "QPS超限额!", 1, 5) | |||
API_TOTAL_REQUEST_LIMIT_REACHED = (19, "Open api total request limit reached", "请求总量超限额!", 1, 2) | |||
INVALID_TOKEN = (100, "Invalid parameter", "无效的access_token参数,token拉取失败", 0, 2) | |||
ACCESS_TOKEN_INVALID_OR_NO_LONGER_VALID = (110, "Access token invalid or no longer valid", "access_token无效,token有效期为30天", 0, 2) | |||
ACCESS_TOKEN_EXPIRED = (111, "Access token expired", "access token过期,token有效期为30天", 0, 2) | |||
INTERNAL_ERROR = (282000, "internal error", "服务器内部错误", 0, 1) | |||
INVALID_PARAM = (216100, "invalid param", "请求中包含非法参数!", 0, 0) | |||
NOT_ENOUGH_PARAM = (216101, "not enough param", "缺少必须的参数!", 0, 0) | |||
SERVICE_NOT_SUPPORT = (216102, "service not support", "请求了不支持的服务,请检查调用的url", 0, 0) | |||
PARAM_TOO_LONG = (216103, "param too long", "请求中某些参数过长!", 1, 0) | |||
APPID_NOT_EXIST = (216110, "appid not exist", "appid不存在", 0, 0) | |||
EMPTY_IMAGE = (216200, "empty image", "图片为空!", 1, 0) | |||
IMAGE_FORMAT_ERROR = (216201, "image format error", "上传的图片格式错误,现阶段我们支持的图片格式为:PNG、JPG、JPEG、BMP", 1, 0) | |||
IMAGE_SIZE_ERROR = (216202, "image size error", "上传的图片大小错误,现阶段我们支持的图片大小为:base64编码后小于4M,分辨率不高于4096*4096", 1, 0) | |||
IMAGE_SIZE_BASE_ERROR = (216203, "image size error", "上传的图片base64编码有误", 1, 0) | |||
RECOGNIZE_ERROR = (216630, "recognize error", "识别错误", 2, 3) | |||
DETECT_ERROR = (216634, "detect error", "检测错误", 2, 3) | |||
MISSING_PARAMETERS = (282003, "missing parameters: {参数名}", "请求参数缺失", 0, 0) | |||
BATCH_ROCESSING_ERROR = (282005, "batch processing error", "处理批量任务时发生部分或全部错误", 0, 5) | |||
BATCH_TASK_LIMIT_REACHED = (282006, "batch task limit reached", "批量任务处理数量超出限制,请将任务数量减少到10或10以下", 1, 5) | |||
IMAGE_TRANSCODE_ERROR = (282100, "image transcode error", "图片压缩转码错误", 0, 1) | |||
IMAGE_SPLIT_LIMIT_REACHED = (282101, "image split limit reached", "长图片切分数量超限!", 1, 1) | |||
TARGET_DETECT_ERROR = (282102, "target detect error", "未检测到图片中识别目标!", 2, 1) # | |||
TARGET_RECOGNIZE_ERROR = (282103, "target recognize error", "图片目标识别错误!", 2, 1) | |||
URL_SIZE_ERROR = (282114, "url size error", "URL长度超过1024字节或为0!", 1, 0) | |||
REQUEST_ID_NOT_EXIST = (282808, "request id: xxxxx not exist", "request id xxxxx 不存在", 0, 0) | |||
RESULT_TYPE_ERROR = (282809, "result type error", "返回结果请求错误(不属于excel或json)", 0, 0) | |||
IMAGE_RECOGNIZE_ERROR = (282810, "image recognize error", "图像识别错误", 2, 1) | |||
INVALID_ARGUMENT = (283300, "Invalid argument", "入参格式有误,可检查下图片编码、代码格式是否有误", 1, 0) | |||
INTERNAL_ERROR_2 = (336000, "Internal error", "服务器内部错误", 0, 0) | |||
INVALID_ARGUMENT_2 = (336001, "Invalid Argument", "入参格式有误,比如缺少必要参数、图片base64编码错误等等,可检查下图片编码、代码格式是否有误", 1, 0) | |||
SDK_IMAGE_SIZE_ERROR = ('SDK100', "image size error", "图片大小超限,要求base64编码后大小不超过4M,最短边至少50px,最长边最大4096px ,建议长宽比3:1以内,图片请求格式支持:PNG、JPG、BMP", 1, 0) | |||
SDK_IMAGE_LENGTH_ERROR = ('SDK101', "image length error", "图片边长不符合要求,最短边至少50px,最长边最大4096px ,建议长宽比3:1以内", 1, 0) | |||
SDK_READ_IMAGE_FILE_ERROR = ('SDK102', "read image file error", "读取图片文件错误", 0, 1) | |||
SDK_CONNECTION_OR_READ_DATA_TIME_OUT = ('SDK108', "connection or read data time out", "连接超时或读取数据超时,请检查本地网络设置、文件读取设置", 0, 3) | |||
SDK_UNSUPPORTED_IMAGE_FORMAT = ('SDK109', "unsupported image format", "不支持的图片格式,当前支持以下几类图片:PNG、JPG、BMP", 1, 0) | |||
BAIDUERRORDATA = { | |||
BaiduSdkErrorEnum.UNKNOWN_ERROR.value[0]: BaiduSdkErrorEnum.UNKNOWN_ERROR, | |||
BaiduSdkErrorEnum.SERVICE_TEMPORARILY_UNAVAILABLE.value[0]: BaiduSdkErrorEnum.SERVICE_TEMPORARILY_UNAVAILABLE, | |||
BaiduSdkErrorEnum.UNSUPPORTED_OPENAPI_METHOD.value[0]: BaiduSdkErrorEnum.UNSUPPORTED_OPENAPI_METHOD, | |||
BaiduSdkErrorEnum.API_REQUEST_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.API_REQUEST_LIMIT_REACHED, | |||
BaiduSdkErrorEnum.NO_PERMISSION_TO_ACCESS_DATA.value[0]: BaiduSdkErrorEnum.NO_PERMISSION_TO_ACCESS_DATA, | |||
BaiduSdkErrorEnum.GET_SERVICE_TOKEN_FAILED.value[0]: BaiduSdkErrorEnum.GET_SERVICE_TOKEN_FAILED, | |||
BaiduSdkErrorEnum.IAM_CERTIFICATION_FAILED.value[0]: BaiduSdkErrorEnum.IAM_CERTIFICATION_FAILED, | |||
BaiduSdkErrorEnum.APP_NOT_EXSITS_OR_CREATE_FAILED.value[0]: BaiduSdkErrorEnum.APP_NOT_EXSITS_OR_CREATE_FAILED, | |||
BaiduSdkErrorEnum.API_DAILY_REQUEST_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.API_DAILY_REQUEST_LIMIT_REACHED, | |||
BaiduSdkErrorEnum.API_QPS_REQUEST_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.API_QPS_REQUEST_LIMIT_REACHED, | |||
BaiduSdkErrorEnum.API_TOTAL_REQUEST_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.API_TOTAL_REQUEST_LIMIT_REACHED, | |||
BaiduSdkErrorEnum.INVALID_TOKEN.value[0]: BaiduSdkErrorEnum.INVALID_TOKEN, | |||
BaiduSdkErrorEnum.ACCESS_TOKEN_INVALID_OR_NO_LONGER_VALID.value[0]: BaiduSdkErrorEnum.ACCESS_TOKEN_INVALID_OR_NO_LONGER_VALID, | |||
BaiduSdkErrorEnum.ACCESS_TOKEN_EXPIRED.value[0]: BaiduSdkErrorEnum.ACCESS_TOKEN_EXPIRED, | |||
BaiduSdkErrorEnum.INTERNAL_ERROR.value[0]: BaiduSdkErrorEnum.INTERNAL_ERROR, | |||
BaiduSdkErrorEnum.INVALID_PARAM.value[0]: BaiduSdkErrorEnum.INVALID_PARAM, | |||
BaiduSdkErrorEnum.NOT_ENOUGH_PARAM.value[0]: BaiduSdkErrorEnum.NOT_ENOUGH_PARAM, | |||
BaiduSdkErrorEnum.SERVICE_NOT_SUPPORT.value[0]: BaiduSdkErrorEnum.SERVICE_NOT_SUPPORT, | |||
BaiduSdkErrorEnum.PARAM_TOO_LONG.value[0]: BaiduSdkErrorEnum.PARAM_TOO_LONG, | |||
BaiduSdkErrorEnum.APPID_NOT_EXIST.value[0]: BaiduSdkErrorEnum.APPID_NOT_EXIST, | |||
BaiduSdkErrorEnum.EMPTY_IMAGE.value[0]: BaiduSdkErrorEnum.EMPTY_IMAGE, | |||
BaiduSdkErrorEnum.IMAGE_FORMAT_ERROR.value[0]: BaiduSdkErrorEnum.IMAGE_FORMAT_ERROR, | |||
BaiduSdkErrorEnum.IMAGE_SIZE_ERROR.value[0]: BaiduSdkErrorEnum.IMAGE_SIZE_ERROR, | |||
BaiduSdkErrorEnum.IMAGE_SIZE_BASE_ERROR.value[0]: BaiduSdkErrorEnum.IMAGE_SIZE_BASE_ERROR, | |||
BaiduSdkErrorEnum.RECOGNIZE_ERROR.value[0]: BaiduSdkErrorEnum.RECOGNIZE_ERROR, | |||
BaiduSdkErrorEnum.DETECT_ERROR.value[0]: BaiduSdkErrorEnum.DETECT_ERROR, | |||
BaiduSdkErrorEnum.MISSING_PARAMETERS.value[0]: BaiduSdkErrorEnum.MISSING_PARAMETERS, | |||
BaiduSdkErrorEnum.BATCH_ROCESSING_ERROR.value[0]: BaiduSdkErrorEnum.BATCH_ROCESSING_ERROR, | |||
BaiduSdkErrorEnum.BATCH_TASK_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.BATCH_TASK_LIMIT_REACHED, | |||
BaiduSdkErrorEnum.IMAGE_TRANSCODE_ERROR.value[0]: BaiduSdkErrorEnum.IMAGE_TRANSCODE_ERROR, | |||
BaiduSdkErrorEnum.IMAGE_SPLIT_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.IMAGE_SPLIT_LIMIT_REACHED, | |||
BaiduSdkErrorEnum.TARGET_DETECT_ERROR.value[0]: BaiduSdkErrorEnum.TARGET_DETECT_ERROR, | |||
BaiduSdkErrorEnum.TARGET_RECOGNIZE_ERROR.value[0]: BaiduSdkErrorEnum.TARGET_RECOGNIZE_ERROR, | |||
BaiduSdkErrorEnum.URL_SIZE_ERROR.value[0]: BaiduSdkErrorEnum.URL_SIZE_ERROR, | |||
BaiduSdkErrorEnum.REQUEST_ID_NOT_EXIST.value[0]: BaiduSdkErrorEnum.REQUEST_ID_NOT_EXIST, | |||
BaiduSdkErrorEnum.RESULT_TYPE_ERROR.value[0]: BaiduSdkErrorEnum.RESULT_TYPE_ERROR, | |||
BaiduSdkErrorEnum.IMAGE_RECOGNIZE_ERROR.value[0]: BaiduSdkErrorEnum.IMAGE_RECOGNIZE_ERROR, | |||
BaiduSdkErrorEnum.INVALID_ARGUMENT.value[0]: BaiduSdkErrorEnum.INVALID_ARGUMENT, | |||
BaiduSdkErrorEnum.INTERNAL_ERROR_2.value[0]: BaiduSdkErrorEnum.INTERNAL_ERROR_2, | |||
BaiduSdkErrorEnum.INVALID_ARGUMENT_2.value[0]: BaiduSdkErrorEnum.INVALID_ARGUMENT_2, | |||
BaiduSdkErrorEnum.SDK_IMAGE_SIZE_ERROR.value[0]: BaiduSdkErrorEnum.SDK_IMAGE_SIZE_ERROR, | |||
BaiduSdkErrorEnum.SDK_IMAGE_LENGTH_ERROR.value[0]: BaiduSdkErrorEnum.SDK_IMAGE_LENGTH_ERROR, | |||
BaiduSdkErrorEnum.SDK_READ_IMAGE_FILE_ERROR.value[0]: BaiduSdkErrorEnum.SDK_READ_IMAGE_FILE_ERROR, | |||
BaiduSdkErrorEnum.SDK_CONNECTION_OR_READ_DATA_TIME_OUT.value[0]: BaiduSdkErrorEnum.SDK_CONNECTION_OR_READ_DATA_TIME_OUT, | |||
BaiduSdkErrorEnum.SDK_UNSUPPORTED_IMAGE_FORMAT.value[0]: BaiduSdkErrorEnum.SDK_UNSUPPORTED_IMAGE_FORMAT, | |||
} | |||
@unique | |||
class VehicleEnum(Enum): | |||
CAR = ("car", "car") | |||
TRICYCLE = ("tricycle", "tricycle") | |||
MOTORBIKE = ("motorbike", "motorbike") | |||
CARPLATE = ("carplate", "carplate") | |||
TRUCK = ("truck", "truck") | |||
BUS = ("bus", "bus") | |||
VehicleEnumVALUE={ | |||
VehicleEnum.CAR.value[0]: VehicleEnum.CAR, | |||
VehicleEnum.TRICYCLE.value[0]: VehicleEnum.TRICYCLE, | |||
VehicleEnum.MOTORBIKE.value[0]: VehicleEnum.MOTORBIKE, | |||
VehicleEnum.CARPLATE.value[0]: VehicleEnum.CARPLATE, | |||
VehicleEnum.TRUCK.value[0]: VehicleEnum.TRUCK, | |||
VehicleEnum.BUS.value[0]: VehicleEnum.BUS | |||
} |
@@ -5,62 +5,36 @@ from enum import Enum, unique | |||
@unique | |||
class ExceptionType(Enum): | |||
VIDEO_UPDATE_EXCEPTION = ("SP000", "Video upload exception!") | |||
OR_VIDEO_ADDRESS_EXCEPTION = ("SP000", "拉取原视频失败!") | |||
OR_VIDEO_ADDRESS_EXCEPTION = ("SP001", "Original Video Address Error!") | |||
ANALYSE_TIMEOUT_EXCEPTION = ("SP001", "AI分析超时!") | |||
ANALYSE_TIMEOUT_EXCEPTION = ("SP002", "Analysis Timeout Exception!") | |||
PULLSTREAM_TIMEOUT_EXCEPTION = ("SP002", "原视频拉流超时!") | |||
PULLSTREAM_TIMEOUT_EXCEPTION = ("SP003", "Pull Stream Timeout Exception!") | |||
READSTREAM_TIMEOUT_EXCEPTION = ("SP003", "原视频读取视频流超时!") | |||
READSTREAM_TIMEOUT_EXCEPTION = ("SP004", "READ Stream Timeout Exception!") | |||
GET_VIDEO_URL_EXCEPTION = ("SP004", "获取原视频播放地址失败!") | |||
GET_VIDEO_URL_EXCEPTION = ("SP005", "Get Video Url Exception!") | |||
GET_VIDEO_URL_TIMEOUT_EXCEPTION = ("SP005", "获取原视频播放地址超时!") | |||
GET_VIDEO_URL_TIMEOUT_EXCEPTION = ("SP006", "Get Video Url Timeout Exception!") | |||
PULL_STREAM_URL_EXCEPTION = ("SP006", "拉流地址不能为空!") | |||
PULL_STREAM_URL_EXCEPTION = ("SP007", "Pull Stream Address Is Empty!") | |||
PUSH_STREAM_URL_EXCEPTION = ("SP007", "推流地址不能为空!") | |||
PULL_PIPELINE_INIT_EXCEPTION = ("SP008", "Pull Stream PIPELINE Exception!") | |||
PUSH_STREAM_TIME_EXCEPTION = ("SP008", "推流时间或原视频时间太短, 未生成分析结果, 建议延长推流时间或原视频时间!") | |||
PUSH_STREAM_URL_EXCEPTION = ("SP009", "Push Stream Address Is Empty!") | |||
AI_MODEL_MATCH_EXCEPTION = ("SP009", "未匹配到对应的AI模型!") | |||
CV2_IS_NULL_EXCEPTION = ("SP010", "The CV2 Is Empty!") | |||
ILLEGAL_PARAMETER_FORMAT = ("SP010", "非法参数格式!") | |||
OR_WRITE_OBJECT_EXCEPTION = ("SP011", "The Original Video Writing Object Is Empty!") | |||
PUSH_STREAMING_CHANNEL_IS_OCCUPIED = ("SP011", "推流通道被占用, 请稍后再试!") | |||
AI_WRITE_OBJECT_EXCEPTION = ("SP012", "The Ai Video Writing Object Is Empty!") | |||
VIDEO_RESOLUTION_EXCEPTION = ("SP012", "不支持该分辨率类型的视频,请切换分辨率再试!") | |||
VIDEO_ADDRESS_EXCEPTION = ("SP013", "The Video Address Does Not Exist!") | |||
READ_IAMGE_URL_EXCEPTION = ("SP013", "未能解析图片地址!") | |||
AI_VIDEO_ADDRESS_EXCEPTION = ("SP014", "AI Video Address Error!") | |||
OFFLINE_RETRY_TIMEOUT_EXCEPTION = ("SP015", "Offline Retry Timeout Exception!") | |||
AI_MODEL_CONFIG_EXCEPTION = ("SP016", "AI Model Config Exception!") | |||
AI_MODEL_MATCH_EXCEPTION = ("SP017", "The AI Model Is Not Matched!") | |||
VIDEO_MERGE_EXCEPTION = ("SP018", "The Video Merge Exception!") | |||
VIDEO_ANALYSIS_EXCEPTION = ("SP019", "Video Analysis Failed!") | |||
PUSH_STREAM_URL_E_EXCEPTION = ("SP020", "Push Stream URL Exception!") | |||
VIDEO_CONFIG_EXCEPTION = ("SP021", "Video Config Exception!") | |||
ILLEGAL_PARAMETER_FORMAT = ("SP022", "Illegal Parameter Format!") | |||
REQUEST_TYPE_NOT_MATCHED = ("SP023", "Request Type Not Matched!") | |||
MODEL_ANALYSIS_EXCEPTION = ("SP024", "Model Analysis Exception!") | |||
PUSH_STREAMING_CHANNEL_IS_OCCUPIED = ("SP025", "推流通道被占用, 请稍后再试!") | |||
WRITE_STREAM_EXCEPTION = ("SP026", "视频写流异常, 请联系工程师定位处理!") | |||
VIDEO_RESOLUTION_EXCEPTION = ("SP027", "不支持该分辨率类型的视频,请切换分辨率再试!") | |||
DETECTION_TARGET_TYPES_ARE_NOT_SUPPORTED = ("SP014", "不支持该类型的检测目标!") | |||
NO_GPU_RESOURCES = ("SP998", "暂无GPU资源可以使用,请稍后再试!") | |||
SERVICE_INNER_EXCEPTION = ("SP999", "系统内部异常, 请联系工程师定位处理!") | |||
SERVICE_INNER_EXCEPTION = ("SP999", "系统内部异常!") |
@@ -1,10 +1,9 @@ | |||
from enum import Enum, unique | |||
# 异常枚举 | |||
@unique | |||
class ModelType(Enum): | |||
WATER_SURFACE_MODEL = ("1", "001", "河道模型", 'river') | |||
FOREST_FARM_MODEL = ("2", "002", "森林模型", 'forest2') | |||
@@ -27,8 +26,34 @@ class ModelType(Enum): | |||
SHIP_MODEL = ("11", "011", "船只模型", 'ship') | |||
BAIDU_MODEL = ("12", "012", "百度AI图片识别模型", None) | |||
def checkCode(code): | |||
for model in ModelType: | |||
if model.value[1] == code: | |||
return True | |||
return False | |||
return False | |||
''' | |||
参数1: 检测目标名称 | |||
参数2: 检测目标 | |||
参数3: 初始化百度检测客户端 | |||
''' | |||
@unique | |||
class BaiduModelTarget(Enum): | |||
VEHICLE_DETECTION = ("车辆检测", 0, lambda client0, client1, url, request_id: client0.vehicleDetectUrl(url, request_id)) | |||
HUMAN_DETECTION = ("人体检测与属性识别", 1, lambda client0, client1, url, request_id: client1.bodyAttr(url, request_id)) | |||
PEOPLE_COUNTING = ("人流量统计", 2, lambda client0, client1, url, request_id: client1.bodyNum(url, request_id)) | |||
BAIDU_MODEL_TARGET_CONFIG = { | |||
BaiduModelTarget.VEHICLE_DETECTION.value[1]: BaiduModelTarget.VEHICLE_DETECTION, | |||
BaiduModelTarget.HUMAN_DETECTION.value[1]: BaiduModelTarget.HUMAN_DETECTION, | |||
BaiduModelTarget.PEOPLE_COUNTING.value[1]: BaiduModelTarget.PEOPLE_COUNTING | |||
} | |||
@@ -0,0 +1,45 @@ | |||
from io import BytesIO | |||
import cv2 | |||
import matplotlib.pyplot as plt | |||
import matplotlib.patches as pat | |||
import numpy as np | |||
import requests | |||
from PIL import ImageDraw, Image | |||
from util.ImageUtils import url2Array | |||
url = "https://www.2008php.com/2015_Website_appreciate/2015-12-06/20151206234254.jpg" | |||
color= (255, 255, 0) | |||
#( 蓝, 绿, 红) | |||
# 红色 (0, 0, 255) | |||
# 洋红色 (255, 0, 255) | |||
# 青色 (255, 255, 0) | |||
# 黑色 (0, 0, 0) | |||
# 蓝色 (255, 0, 0) | |||
# 绿色 (0, 255, 0) | |||
# 黄色 (0, 255, 255) # 不考虑 | |||
img = url2Array(url) | |||
cv2.putText(img,"Hello World", (100,100), cv2.FONT_HERSHEY_SIMPLEX, 1.0,color, 1, cv2.LINE_AA) | |||
# rectangle 坐标的参数格式为左上角(x1, y1),右下角(x2, y2), 颜色 , 粗细 | |||
cv2.rectangle(img, (100, 110), (400, 310), color, 2) | |||
cv2.imshow('img', img) | |||
cv2.waitKey() | |||
# fig, ax = plt.subplots(1) | |||
# ax.imshow(img) | |||
# # Rectangle 坐标的参数格式为左上角(x, y),width, height。 | |||
# rec = pat.Rectangle((386, 144), 1049, 760, linewidth=2, edgecolor='r', facecolor='None') | |||
# ax.add_patch(rec) | |||
# plt.imshow(img) | |||
# plt.show() | |||
# response = requests.get(url) | |||
# image = Image.open(BytesIO(response.content)) | |||
# a = ImageDraw.ImageDraw(image) | |||
# # rectangle 坐标的参数格式为左上角(x1, y1),右下角(x2, y2)。 | |||
# a.rectangle(((386, 144), (1435, 904)), fill=None, outline='red', width=2) | |||
# image.show() | |||
@@ -1,29 +1,9 @@ | |||
# a=None | |||
# for i in range(12): | |||
# if a is None: | |||
# a = str(i) | |||
# else: | |||
# a = '%s,%s' % (a, str(i)) | |||
# print(a) | |||
# a=[1,2,3,4,5,8, 9] | |||
# b=[1,3,2] | |||
# if set(a) >= set(b): | |||
# print("a") | |||
# else: | |||
# print("b") | |||
from enums.ModelTypeEnum import ModelType | |||
if ModelType.WATER_SURFACE_MODEL == ModelType.FOREST_FARM_MODEL: | |||
print("aaaaa") | |||
else: | |||
print("bbbbbbbbbb") | |||
if isinstance(ModelType.WATER_SURFACE_MODEL, ModelType): | |||
print("aaaaa") | |||
else: | |||
print("bbbbbbbbbb") | |||
if type(ModelType.WATER_SURFACE_MODEL)==ModelType.FOREST_FARM_MODEL: | |||
print("aaaaa") | |||
else: | |||
print("bbbbbbbbbb") | |||
aaa={"1":"1","2":"2","3":"3","4": {"1": "4"}} | |||
for i,v in aaa.items(): | |||
if i =="4": | |||
v["1"] = "5" | |||
print(aaa) |
@@ -26,6 +26,25 @@ class AliyunOssSdk(): | |||
self.content["aliyun"]["oss"]["bucket"], | |||
connect_timeout=self.content["aliyun"]["oss"]["connect_timeout"]) | |||
def sync_upload_file(self, updatePath, fileByte): | |||
self.logger.info("开始上传文件到oss, requestId:{}", self.requestId) | |||
self.get_oss_bucket() | |||
MAX_RETRIES = 3 | |||
retry_count = 0 | |||
while True: | |||
try: | |||
self.bucket.put_object(updatePath, fileByte) | |||
self.logger.info("上传文件到oss成功! requestId:{}", self.requestId) | |||
break | |||
except Exception as e: | |||
retry_count += 1 | |||
time.sleep(1) | |||
self.logger.info("上传文件到oss失败, 重试次数:{}, requestId:{}", retry_count, self.requestId) | |||
if retry_count > MAX_RETRIES: | |||
self.logger.exception("上传文件到oss重试失败:{}, requestId:{}", e, self.requestId) | |||
raise e | |||
async def put_object(self, updatePath, fileByte): | |||
self.bucket.put_object(updatePath, fileByte) | |||
@@ -118,8 +137,8 @@ class ThAliyunVodSdk(): | |||
self.logger.error("vod视频上传失败,重试次数:{}, requestId:{}", retry_count, self.requestId) | |||
if retry_count >= MAX_RETRIES: | |||
self.logger.exception("vod视频上传重试失败: {}, requestId:{}", e, self.requestId) | |||
raise ServiceException(ExceptionType.VIDEO_UPDATE_EXCEPTION.value[0], | |||
ExceptionType.VIDEO_UPDATE_EXCEPTION.value[1]) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
def get_play_url(args): |
@@ -475,20 +475,23 @@ class Cv2Util(): | |||
def build_write(self): | |||
try: | |||
if self.fps is None or self.width is None or self.height is None: | |||
raise ServiceException(ExceptionType.VIDEO_CONFIG_EXCEPTION.value[0], | |||
ExceptionType.VIDEO_CONFIG_EXCEPTION.value[1]) | |||
logger.error("fps、 width、 height为空, requestId:{}", self.requestId) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
if self.orFilePath is not None and self.or_video_file is None: | |||
self.or_video_file = cv2.VideoWriter(self.orFilePath, cv2.VideoWriter_fourcc(*'mp4v'), self.fps, | |||
(int(self.wn), int(self.hn))) | |||
if self.or_video_file is None: | |||
raise ServiceException(ExceptionType.OR_WRITE_OBJECT_EXCEPTION.value[0], | |||
ExceptionType.OR_WRITE_OBJECT_EXCEPTION.value[1]) | |||
logger.error("or_video_file为空, requestId:{}", self.requestId) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
if self.aiFilePath is not None and self.ai_video_file is None: | |||
self.ai_video_file = cv2.VideoWriter(self.aiFilePath, cv2.VideoWriter_fourcc(*'mp4v'), self.fps, | |||
(int(self.wn * 2), int(self.hn))) | |||
if self.ai_video_file is None: | |||
raise ServiceException(ExceptionType.AI_WRITE_OBJECT_EXCEPTION.value[0], | |||
ExceptionType.AI_WRITE_OBJECT_EXCEPTION.value[1]) | |||
logger.error("ai_video_file为空, requestId:{}", self.requestId) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
except ServiceException as s: | |||
logger.exception("构建文件写对象异常: {}, requestId:{}", s, self.requestId) | |||
raise s | |||
@@ -506,27 +509,20 @@ class Cv2Util(): | |||
def getP(self): | |||
if self.p is None: | |||
logger.error("获取管道为空, requestId:{}", self.requestId) | |||
raise ServiceException(ExceptionType.PULL_PIPELINE_INIT_EXCEPTION.value[0], | |||
ExceptionType.PULL_PIPELINE_INIT_EXCEPTION.value[1]) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
return self.p | |||
def getCap(self): | |||
if self.cap is None: | |||
logger.error("获取cv2为空, requestId:{}", self.requestId) | |||
raise ServiceException(ExceptionType.CV2_IS_NULL_EXCEPTION.value[0], | |||
ExceptionType.CV2_IS_NULL_EXCEPTION.value[1]) | |||
return self.cap | |||
def getOrVideoFile(self): | |||
if self.or_video_file is None: | |||
logger.error("获取原视频写入对象为空, requestId:{}", self.requestId) | |||
raise ServiceException(ExceptionType.OR_WRITE_OBJECT_EXCEPTION.value[0], | |||
ExceptionType.OR_WRITE_OBJECT_EXCEPTION.value[1]) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
return self.or_video_file | |||
def getAiVideoFile(self): | |||
if self.ai_video_file is None: | |||
logger.error("获取AI视频写入对象为空, requestId:{}", self.requestId) | |||
raise ServiceException(ExceptionType.AI_WRITE_OBJECT_EXCEPTION.value[0], | |||
ExceptionType.AI_WRITE_OBJECT_EXCEPTION.value[1]) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
return self.ai_video_file |
@@ -155,37 +155,41 @@ class PictureWaterMark: | |||
dst_channels[i][ul_points[0]: dr_points[0], ul_points[1]: dr_points[1]] = dst_channels[i][ | |||
ul_points[0]: dr_points[0], | |||
ul_points[1]: dr_points[1]] * ( | |||
255.0 - mask_channels[3] * alpha) / 255 | |||
255.0 - mask_channels[ | |||
3] * alpha) / 255 | |||
dst_channels[i][ul_points[0]: dr_points[0], ul_points[1]: dr_points[1]] += np.array( | |||
mask_channels[i] * (mask_channels[3] * alpha / 255), dtype=np.uint8) | |||
dst_img = cv2.merge(dst_channels) | |||
return dst_img | |||
#差值感知算法 | |||
# 差值感知算法 | |||
def dHash(image): | |||
#缩放9*8 | |||
image=cv2.resize(image,(9,8),interpolation=cv2.INTER_CUBIC) | |||
#转换灰度图 | |||
image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) | |||
# 缩放9*8 | |||
image = cv2.resize(image, (9, 8), interpolation=cv2.INTER_CUBIC) | |||
# 转换灰度图 | |||
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |||
# print(image.shape) | |||
hash=[] | |||
#每行前一个像素大于后一个像素为1,相反为0,生成哈希 | |||
hash = [] | |||
# 每行前一个像素大于后一个像素为1,相反为0,生成哈希 | |||
for i in range(8): | |||
for j in range(8): | |||
if image[i,j]>image[i,j+1]: | |||
if image[i, j] > image[i, j + 1]: | |||
hash.append(1) | |||
else: | |||
hash.append(0) | |||
return hash | |||
#计算汉明距离 | |||
def Hamming_distance(hash1,hash2): | |||
# 计算汉明距离 | |||
def Hamming_distance(hash1, hash2): | |||
num = 0 | |||
for index in range(len(hash1)): | |||
if hash1[index] != hash2[index]: | |||
num += 1 | |||
return num | |||
def url2Array(url): | |||
response = requests.get(url) | |||
image = Image.open(BytesIO(response.content)) | |||
@@ -193,36 +197,68 @@ def url2Array(url): | |||
img_bgr = cv2.cvtColor(image1, cv2.COLOR_RGB2BGR) | |||
return img_bgr | |||
if __name__ == '__main__': | |||
# img = cv2.imread("../test/a.jpg", -1) | |||
# fontcolor = 'yellow' | |||
# | |||
# water = TextWaterMark() | |||
# text = "hello world" | |||
# | |||
# # fill_img = water.common_water(img, text, position=4, fontface='../font/庞门正道标题体2.0增强版.ttf', fontsize=20, fontcolor='black') | |||
# fill_img = water.fill_water(img, text, 20) | |||
# # 一定要保存为png格式 | |||
# cv2.imshow('result', fill_img) | |||
# cv2.waitKey(111111110) | |||
# print('finish') | |||
pic = PictureWaterMark() | |||
image = cv2.imread("a.jpg") | |||
logo = cv2.imread("../image/logo.png", -1) | |||
# print(image, logo) | |||
start = time.time() | |||
frame = pic.common_water(image, logo) | |||
print(time.time() - start) | |||
start1 = time.time() | |||
frame1 = pic.common_water_1(image, logo) | |||
# cv2.imwrite("watermarked.jpg", frame1) | |||
print(time.time() - start1) | |||
# cap = cv2.VideoCapture("../data/111111.mp4") | |||
# logo = cv2.imread("../image/logo.png", -1) | |||
# while True: | |||
# is_opened, frame = cap.read() | |||
# frame = pic.common_water(frame, logo) | |||
# cv2.imshow('frame', frame) | |||
# cv2.waitKey(1) # 等待输入任何按键 | |||
# # 关闭 | |||
# cap.release() | |||
def url2Content(url): | |||
response = requests.get(url) | |||
return response.content | |||
def url2Image(url): | |||
response = requests.get(url) | |||
image = Image.open(BytesIO(response.content)) | |||
image1 = np.array(image) | |||
img_bgr = cv2.cvtColor(image1, cv2.COLOR_RGB2BGR) | |||
img = Image.fromarray(img_bgr) | |||
return img | |||
def url2Byte(url): | |||
response = requests.get(url) | |||
return BytesIO(response.content) | |||
def markRectangle(url, text, textCoordinate, imageLeftUpCoordinate, imageRightDownCoordinate, color): | |||
img = url2Array(url) | |||
#( 蓝, 绿, 红) | |||
# 红色 (0, 0, 255) | |||
# 洋红色 (255, 0, 255) | |||
# 青色 (255, 255, 0) | |||
# 黑色 (0, 0, 0) | |||
# 蓝色 (255, 0, 0) | |||
# 绿色 (0, 255, 0) | |||
# 黄色 (0, 255, 255) # 不考虑 | |||
cv2.putText(img, text, textCoordinate, cv2.FONT_HERSHEY_SIMPLEX, 1.0, color, 1, cv2.LINE_AA) | |||
# rectangle 坐标的参数格式为左上角(x1, y1),右下角(x2, y2), 颜色 , 粗细 | |||
cv2.rectangle(img, imageLeftUpCoordinate, imageRightDownCoordinate, color, 2) | |||
return img | |||
# if __name__ == '__main__': | |||
# # img = cv2.imread("../test/a.jpg", -1) | |||
# # fontcolor = 'yellow' | |||
# # | |||
# # water = TextWaterMark() | |||
# # text = "hello world" | |||
# # | |||
# # # fill_img = water.common_water(img, text, position=4, fontface='../font/庞门正道标题体2.0增强版.ttf', fontsize=20, fontcolor='black') | |||
# # fill_img = water.fill_water(img, text, 20) | |||
# # # 一定要保存为png格式 | |||
# # cv2.imshow('result', fill_img) | |||
# # cv2.waitKey(111111110) | |||
# # print('finish') | |||
# pic = PictureWaterMark() | |||
# image = cv2.imread("a.jpg") | |||
# logo = cv2.imread("../image/logo.png", -1) | |||
# # print(image, logo) | |||
# start = time.time() | |||
# frame = pic.common_water(image, logo) | |||
# print(time.time() - start) | |||
# start1 = time.time() | |||
# frame1 = pic.common_water_1(image, logo) | |||
# # cv2.imwrite("watermarked.jpg", frame1) | |||
# print(time.time() - start1) | |||
# # cap = cv2.VideoCapture("../data/111111.mp4") | |||
# # logo = cv2.imread("../image/logo.png", -1) | |||
# # while True: | |||
# # is_opened, frame = cap.read() | |||
# # frame = pic.common_water(frame, logo) | |||
# # cv2.imshow('frame', frame) | |||
# # cv2.waitKey(1) # 等待输入任何按键 | |||
# # # 关闭 | |||
# # cap.release() |
@@ -0,0 +1,240 @@ | |||
import base64 | |||
import time | |||
from threading import Lock | |||
import yaml | |||
from aip import AipImageClassify, AipBodyAnalysis | |||
from loguru import logger | |||
from enums.BaiduSdkEnum import BAIDUERRORDATA | |||
from enums.ExceptionEnum import ExceptionType | |||
from exception.CustomerException import ServiceException | |||
from util.ImageUtils import url2Byte, url2Content | |||
class AipImageClassifyClient: | |||
def __init__(self, content): | |||
self.__content = content | |||
self.__client = None | |||
self.init_client() | |||
# self.lock = Lock() | |||
def init_client(self): | |||
if self.__client is None: | |||
self.__client = AipImageClassify(str(self.__content["baidu"]["vehicle"]["APP_ID"]), | |||
self.__content["baidu"]["vehicle"]["API_KEY"], | |||
self.__content["baidu"]["vehicle"]["SECRET_KEY"]) | |||
''' | |||
车辆检测 | |||
''' | |||
def vehicleDetectUrl(self, url, request_id, options={}): | |||
self.init_client() | |||
# try: | |||
# self.lock.acquire() | |||
reply_num = 0 | |||
reply_value = None | |||
while True: | |||
try: | |||
options["show"] = "true" | |||
res_image = self.__client.vehicleDetectUrl(url, options) | |||
error_code = res_image.get("error_code") | |||
if error_code: | |||
enum = BAIDUERRORDATA.get(error_code) | |||
# 如果异常编码未知, 返回空值 | |||
if enum is None: | |||
logger.error("百度云车辆检测异常!error_code:{}, request_id: {}", error_code, request_id) | |||
return None | |||
# 重试指定次数后,还是异常,输出统一内部异常 | |||
if enum.value[3] == 0: | |||
if reply_value is None: | |||
reply_value = enum.value[4] | |||
logger.error("百度云车辆检测异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}", | |||
enum.value[0], enum.value[2], reply_num, request_id) | |||
raise Exception() | |||
# 重试指定次数后,还是异常,输出对应的异常 | |||
if enum.value[3] == 1: | |||
if reply_value is None: | |||
reply_value = enum.value[4] | |||
raise ServiceException(str(enum.value[0]), enum.value[2]) | |||
# 重试指定次数后,还是异常,输出空 | |||
if enum.value[3] == 2: | |||
if reply_value is None: | |||
reply_value = enum.value[4] | |||
if reply_num >= reply_value: | |||
return None | |||
return res_image | |||
except Exception as e: | |||
logger.exception("车辆检测失败: {}, 当前重试次数:{}, request_id: {}", e, reply_num, request_id) | |||
time.sleep(1) | |||
reply_num += 1 | |||
self.init_client() | |||
if reply_num > reply_value: | |||
if isinstance(e, ServiceException): | |||
raise ServiceException(e.code, e.msg) | |||
logger.exception("车辆检测识别失败: {}, request_id: {}", e, request_id) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
# except Exception as ee: | |||
# logger.exception("车辆检测加锁异常: {}, request_id: {}", ee, request_id) | |||
# raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0], | |||
# ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1]) | |||
# finally: | |||
# self.lock.release() | |||
class AipBodyAnalysisClient: | |||
def __init__(self, content): | |||
self.__content = content | |||
self.__client = None | |||
self.init_client() | |||
# self.lock = Lock() | |||
def init_client(self): | |||
if self.__client is None: | |||
self.__client = AipBodyAnalysis(str(self.__content["baidu"]["person"]["APP_ID"]), | |||
self.__content["baidu"]["person"]["API_KEY"], | |||
self.__content["baidu"]["person"]["SECRET_KEY"]) | |||
''' | |||
人体检测与属性识别 | |||
''' | |||
def bodyAttr(self, url, request_id, options={}): | |||
self.init_client() | |||
image = self.readImage(url, request_id) | |||
# try: | |||
# self.lock.acquire() | |||
reply_num = 0 | |||
reply_value = None | |||
while True: | |||
try: | |||
options["show"] = "true" | |||
res_image = self.__client.bodyAttr(image, options) | |||
error_code = res_image.get("error_code") | |||
if error_code: | |||
enum = BAIDUERRORDATA.get(error_code) | |||
# 如果异常编码未知, 返回空值 | |||
if enum is None: | |||
logger.error("百度云人体检测与属性识别异常!error_code:{}, request_id: {}", error_code, request_id) | |||
return None | |||
# 重试指定次数后,还是异常,输出统一内部异常 | |||
if enum.value[3] == 0: | |||
if reply_value is None: | |||
reply_value = enum.value[4] | |||
logger.error("百度云人体检测与属性识别异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}", | |||
enum.value[0], enum.value[2], reply_num, request_id) | |||
raise Exception() | |||
# 重试指定次数后,还是异常,输出对应的异常 | |||
if enum.value[3] == 1: | |||
if reply_value is None: | |||
reply_value = enum.value[4] | |||
raise ServiceException(str(enum.value[0]), enum.value[2]) | |||
# 重试指定次数后,还是异常,输出空 | |||
if enum.value[3] == 2: | |||
if reply_value is None: | |||
reply_value = enum.value[4] | |||
if reply_num >= reply_value: | |||
return None | |||
return res_image | |||
except Exception as e: | |||
logger.exception("人体检测与属性识别失败: {}, 当前重试次数:{}, request_id: {}", e, reply_num, request_id) | |||
time.sleep(0.5) | |||
reply_num += 1 | |||
self.init_client() | |||
if reply_num > reply_value: | |||
if isinstance(e, ServiceException): | |||
raise ServiceException(e.code, e.msg) | |||
logger.exception("人体检测与属性识别失败: {}, request_id: {}", e, request_id) | |||
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0], | |||
ExceptionType.SERVICE_INNER_EXCEPTION.value[1]) | |||
# except Exception as ee: | |||
# logger.exception("车辆检测加锁异常: {}, request_id: {}", ee, request_id) | |||
# raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0], | |||
# ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1]) | |||
# finally: | |||
# self.lock.release() | |||
''' | |||
人流量统计 | |||
''' | |||
def bodyNum(self, url, request_id, options={}): | |||
self.init_client() | |||
image = self.readImage(url, request_id) | |||
# try: | |||
# self.lock.acquire() | |||
reply_num = 0 | |||
reply_value = None | |||
while True: | |||
try: | |||
options["show"] = "true" | |||
res_image = self.__client.bodyNum(image, options) | |||
error_code = res_image.get("error_code") | |||
if error_code: | |||
enum = BAIDUERRORDATA.get(error_code) | |||
# 如果异常编码未知, 返回空值 | |||
if enum is None: | |||
logger.error("百度云人流量统计异常!error_code:{}, request_id: {}", error_code, request_id) | |||
return None | |||
# 重试指定次数后,还是异常,输出统一内部异常 | |||
if enum.value[3] == 0: | |||
if reply_value is None: | |||
reply_value = enum.value[4] | |||
logger.error("百度云人流量统计异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}", | |||
enum.value[0], enum.value[2], reply_num, request_id) | |||
raise Exception() | |||
# 重试指定次数后,还是异常,输出对应的异常 | |||
if enum.value[3] == 1: | |||
if reply_value is None: | |||
reply_value = enum.value[4] | |||
raise ServiceException(str(enum.value[0]), enum.value[2]) | |||
# 重试指定次数后,还是异常,输出空 | |||
if enum.value[3] == 2: | |||
if reply_value is None: | |||
reply_value = enum.value[4] | |||
if reply_num >= reply_value: | |||
return None | |||
return res_image | |||
except ServiceException as e: | |||
raise ServiceException(e.code, e.msg) | |||
except Exception as e: | |||
logger.exception("人流量统计失败: {}, 当前重试次数:{}, request_id: {}", e, reply_num, request_id) | |||
time.sleep(0.5) | |||
reply_num += 1 | |||
self.init_client() | |||
if reply_num > reply_value: | |||
if isinstance(e, ServiceException): | |||
raise ServiceException(e.code, e.msg) | |||
logger.exception("人流量统计失败: {}, request_id: {}", e, request_id) | |||
raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0], | |||
ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1]) | |||
# except Exception as ee: | |||
# logger.exception("车辆检测加锁异常: {}, request_id: {}", ee, request_id) | |||
# raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0], | |||
# ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1]) | |||
# finally: | |||
# self.lock.release() | |||
def readImage(self, url, request_id): | |||
try: | |||
return url2Content(url) | |||
except Exception as e: | |||
logger.exception("读取图片异常!url: {}, request_id: {}", url, request_id, e) | |||
raise ServiceException(ExceptionType.READ_IAMGE_URL_EXCEPTION.value[0], | |||
ExceptionType.READ_IAMGE_URL_EXCEPTION.value[1]) | |||
# if __name__ == '__main__': | |||
# with open(r"D:\work\alg_new\tuoheng_alg\dsp_application.yml", "r", encoding='utf-8') as f: | |||
# file_content = f.read() | |||
# content = yaml.load(file_content, yaml.FullLoader) | |||
# aipImageClassifyClient = AipImageClassifyClient(content) | |||
# aipBodyAnalysisClient = AipBodyAnalysisClient(content) | |||
# url = "https://pic.52112.com/180623/JPG-180623-12/c4cyivkxEh_small.jpg" | |||
# # result = aipImageClassifyClient.vehicleDetectUrl(url, "1111111") | |||
# result = aipBodyAnalysisClient.bodyNum(url, "1111111") | |||
# iamge = base64.b64decode(result.get("image")) | |||
# print(iamge) |
@@ -1,28 +1,33 @@ | |||
# -*- coding: utf-8 -*- | |||
import base64 | |||
import sys | |||
from enums.ModelTypeEnum import ModelType | |||
from enums.ExceptionEnum import ExceptionType | |||
from enums.ModelTypeEnum import ModelType, BAIDU_MODEL_TARGET_CONFIG, BaiduModelTarget | |||
from exception.CustomerException import ServiceException | |||
from util.GPUtils import get_all_gpu_ids | |||
from util.ImgBaiduSdk import AipBodyAnalysisClient, AipImageClassifyClient | |||
sys.path.extend(['..', '../AIlib2']) | |||
from AI import AI_process,AI_process_forest,get_postProcess_para | |||
import cv2,os,time | |||
from AI import AI_process, AI_process_forest, get_postProcess_para | |||
import cv2, os, time | |||
from segutils.segmodel import SegModel | |||
from models.experimental import attempt_load | |||
from utils.torch_utils import select_device | |||
from utilsK.queRiver import get_labelnames,get_label_arrays,save_problem_images | |||
from utilsK.queRiver import get_labelnames, get_label_arrays, save_problem_images | |||
import numpy as np | |||
import torch,glob | |||
import torch, glob | |||
import tensorrt as trt | |||
from utilsK.masterUtils import get_needed_objectsIndex | |||
from utilsK.jkmUtils import pre_process,post_process,get_return_data | |||
from utilsK.jkmUtils import pre_process, post_process, get_return_data | |||
# 统一模型入口 | |||
class Model: | |||
def __init__(self, device, allowedList=None, logger=None, requestId=None, modeType=None): | |||
def __init__(self, device, allowedList=None, logger=None, requestId=None, modeType=None, content=None): | |||
try: | |||
logger.info("########################加载{}########################, requestId:{}", modeType.value[2], requestId) | |||
logger.info("########################加载{}########################, requestId:{}", modeType.value[2], | |||
requestId) | |||
self.modeType = modeType | |||
self.allowedList = allowedList | |||
self.trtFlag_det = True, # 检测模型是否采用TRT | |||
@@ -56,7 +61,7 @@ class Model: | |||
'segPar': { | |||
'modelSize': (640, 360), | |||
'mean': (0.485, 0.456, 0.406), | |||
'std' : (0.229, 0.224, 0.225), | |||
'std': (0.229, 0.224, 0.225), | |||
'numpy': False, | |||
'RGB_convert_first': True | |||
}, # 分割模型预处理参数 | |||
@@ -80,8 +85,8 @@ class Model: | |||
Detweights = par.get('Detweights') # 升级后的检测模型 | |||
if self.trtFlag_det: | |||
with open(Detweights, "rb") as f, trt.Runtime(trt.Logger(trt.Logger.ERROR)) as runtime: | |||
self.model = runtime.deserialize_cuda_engine(f.read())# 输入trt本地文件,返回ICudaEngine对象 | |||
print('####load TRT model :%s'%(Detweights)) | |||
self.model = runtime.deserialize_cuda_engine(f.read()) # 输入trt本地文件,返回ICudaEngine对象 | |||
print('####load TRT model :%s' % (Detweights)) | |||
else: | |||
self.model = attempt_load(Detweights, map_location=self.device) # load FP32 model | |||
if self.half: | |||
@@ -118,7 +123,6 @@ class Model: | |||
logger.exception("异常:{}, requestId:{}", ee, requestId) | |||
raise ee | |||
def process(self, frame, width=1920): | |||
if self.label_arraylist is None: | |||
fontsize = int(width / 1920 * 40) | |||
@@ -145,6 +149,7 @@ class Model: | |||
self.rainbows, self.half, self.device, self.conf_thres, self.iou_thres, | |||
self.allowedList, font=self.digitFont, trtFlag_det=self.trtFlag_det) | |||
# # 河道模型 | |||
# class SZModel: | |||
# def __init__(self, device, allowedList=None, logger=None, requestId=None): | |||
@@ -685,20 +690,21 @@ class Model: | |||
# 车牌分割模型、健康码、行程码分割模型 | |||
class IMModel: | |||
def __init__(self, device, allowedList=None, logger=None, requestId=None, modeType=None): | |||
def __init__(self, device, allowedList=None, logger=None, requestId=None, modeType=None, content=None): | |||
logger.info("########################加载{}########################, requestId:{}", modeType.value[2], requestId) | |||
self.allowedList = allowedList | |||
if ModelType.EPIDEMIC_PREVENTION_MODEL == modeType: | |||
self.img_type = 'code' ## code,plate | |||
if ModelType.PLATE_MODEL == modeType: | |||
self.img_type = 'plate' ## code,plate | |||
self.par = {'code': {'weights': '../AIlib2/weights/conf/jkm/health_yolov5s_v3.jit', 'img_type': 'code', 'nc': 10}, | |||
'plate': {'weights': '../AIlib2/weights/conf/jkm/plate_yolov5s_v3.jit', 'img_type': 'plate', 'nc': 1}, | |||
'conf_thres': 0.4, | |||
'iou_thres': 0.45, | |||
'device': 'cuda:%s' % device, | |||
'plate_dilate': (0.5, 0.3) | |||
} | |||
self.par = { | |||
'code': {'weights': '../AIlib2/weights/conf/jkm/health_yolov5s_v3.jit', 'img_type': 'code', 'nc': 10}, | |||
'plate': {'weights': '../AIlib2/weights/conf/jkm/plate_yolov5s_v3.jit', 'img_type': 'plate', 'nc': 1}, | |||
'conf_thres': 0.4, | |||
'iou_thres': 0.45, | |||
'device': 'cuda:%s' % device, | |||
'plate_dilate': (0.5, 0.3) | |||
} | |||
self.device = torch.device(self.par['device']) | |||
self.model = torch.jit.load(self.par[self.img_type]['weights']) | |||
@@ -708,4 +714,72 @@ class IMModel: | |||
boxes = post_process(pred, padInfos, self.device, conf_thres=self.par['conf_thres'], | |||
iou_thres=self.par['iou_thres'], nc=self.par[self.img_type]['nc']) # 后处理 | |||
dataBack = get_return_data(frame, boxes, modelType=self.img_type, plate_dilate=self.par['plate_dilate']) | |||
return dataBack | |||
return dataBack | |||
# 百度AI图片识别模型 | |||
class BaiduAiImageModel: | |||
def __init__(self, device=None, allowedList=None, logger=None, requestId=None, modeType=None, content=None): | |||
logger.info("########################加载{}########################, requestId:{}", modeType.value[2], requestId) | |||
self.allowedList = allowedList | |||
self.__requestId = requestId | |||
self.__logger = logger | |||
self.__aipBodyAnalysisClient = AipBodyAnalysisClient(content) | |||
self.__aipImageClassifyClient = AipImageClassifyClient(content) | |||
def process(self, target, url): | |||
baiduEnum = BAIDU_MODEL_TARGET_CONFIG.get(target) | |||
if baiduEnum is None: | |||
raise ServiceException(ExceptionType.DETECTION_TARGET_TYPES_ARE_NOT_SUPPORTED.value[0], | |||
ExceptionType.DETECTION_TARGET_TYPES_ARE_NOT_SUPPORTED.value[1] | |||
+ " target: " + target) | |||
return baiduEnum.value[2](self.__aipImageClassifyClient, self.__aipBodyAnalysisClient, url, self.__requestId) | |||
MODEL_CONFIG = { | |||
# 加载河道模型 | |||
ModelType.WATER_SURFACE_MODEL.value[1]: ( | |||
lambda x, y, z, r: Model(x, y, z, r, ModelType.WATER_SURFACE_MODEL), | |||
ModelType.WATER_SURFACE_MODEL.value[1]), | |||
# 加载林场模型 | |||
ModelType.FOREST_FARM_MODEL.value[1]: ( | |||
lambda x, y, z, r: Model(x, y, z, r, ModelType.FOREST_FARM_MODEL), | |||
ModelType.FOREST_FARM_MODEL.value[1]), | |||
# 加载交通模型 | |||
ModelType.TRAFFIC_FARM_MODEL.value[1]: ( | |||
lambda x, y, z, r: Model(x, y, z, r, ModelType.TRAFFIC_FARM_MODEL), | |||
ModelType.TRAFFIC_FARM_MODEL.value[1]), | |||
# 加载防疫模型 | |||
ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]: ( | |||
lambda x, y, z, r: IMModel(x, y, z, r, ModelType.EPIDEMIC_PREVENTION_MODEL), | |||
ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]), | |||
# 加载车牌模型 | |||
ModelType.PLATE_MODEL.value[1]: ( | |||
lambda x, y, z, r: IMModel(x, y, z, r, ModelType.PLATE_MODEL), ModelType.PLATE_MODEL.value[1]), | |||
# 加载车辆模型 | |||
ModelType.VEHICLE_MODEL.value[1]: ( | |||
lambda x, y, z, r: Model(x, y, z, r, ModelType.VEHICLE_MODEL), ModelType.VEHICLE_MODEL.value[1]), | |||
# 加载行人模型 | |||
ModelType.PEDESTRIAN_MODEL.value[1]: ( | |||
lambda x, y, z, r: Model(x, y, z, r, ModelType.PEDESTRIAN_MODEL), | |||
ModelType.PEDESTRIAN_MODEL.value[1]), | |||
# 加载烟火模型 | |||
ModelType.SMOGFIRE_MODEL.value[1]: ( | |||
lambda x, y, z, r: Model(x, y, z, r, ModelType.SMOGFIRE_MODEL), ModelType.SMOGFIRE_MODEL.value[1]), | |||
# 加载钓鱼游泳模型 | |||
ModelType.ANGLERSWIMMER_MODEL.value[1]: ( | |||
lambda x, y, z, r: Model(x, y, z, r, ModelType.ANGLERSWIMMER_MODEL), | |||
ModelType.ANGLERSWIMMER_MODEL.value[1]), | |||
# 加载乡村模型 | |||
ModelType.COUNTRYROAD_MODEL.value[1]: ( | |||
lambda x, y, z, r: Model(x, y, z, r, ModelType.COUNTRYROAD_MODEL), | |||
ModelType.COUNTRYROAD_MODEL.value[1]), | |||
# 加载船只模型 | |||
ModelType.SHIP_MODEL.value[1]: ( | |||
lambda x, y, z, r: Model(x, y, z, r, ModelType.SHIP_MODEL), ModelType.SHIP_MODEL.value[1]), | |||
# 百度AI图片识别模型 | |||
ModelType.BAIDU_MODEL.value[1]: ( | |||
lambda x, y, z, r, t: BaiduAiImageModel(x, y, z, r, ModelType.BAIDU_MODEL, t), | |||
ModelType.BAIDU_MODEL.value[1]) | |||
} |
@@ -17,8 +17,8 @@ class OcrBaiduSdk: | |||
# self.lock = Lock() | |||
def init_client(self): | |||
self.client = AipOcr(str(self.content["baiduocr"]["APP_ID"]), self.content["baiduocr"]["API_KEY"], | |||
self.content["baiduocr"]["SECRET_KEY"]) | |||
self.client = AipOcr(str(self.content["baidu"]["orc"]["APP_ID"]), self.content["baidu"]["orc"]["API_KEY"], | |||
self.content["baidu"]["orc"]["SECRET_KEY"]) | |||
''' | |||
{ | |||
@@ -31,6 +31,7 @@ class OcrBaiduSdk: | |||
] | |||
} | |||
''' | |||
def universal_text_recognition(self, image, request_id): | |||
# try: | |||
# self.lock.acquire() | |||
@@ -67,6 +68,7 @@ class OcrBaiduSdk: | |||
# ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1]) | |||
# finally: | |||
# self.lock.release() | |||
''' | |||
{ | |||
"log_id": 3583925545, | |||
@@ -76,6 +78,7 @@ class OcrBaiduSdk: | |||
} | |||
} | |||
''' | |||
def license_plate_recognition(self, image, request_id): | |||
# try: | |||
# self.lock.acquire() | |||
@@ -112,5 +115,3 @@ class OcrBaiduSdk: | |||
# ExceptionType.ABNORMAL_LICENSE_PLATE_RECOGNITION.value[1]) | |||
# finally: | |||
# self.lock.release() | |||