<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||
<project version="4"> | <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> | <serverData> | ||||
<paths name="10.21"> | <paths name="10.21"> | ||||
<serverdata> | <serverdata> | ||||
</serverdata> | </serverdata> | ||||
</paths> | </paths> | ||||
</serverData> | </serverData> | ||||
<option name="myAutoUpload" value="ALWAYS" /> | |||||
</component> | </component> | ||||
</project> | </project> |
</component> | </component> | ||||
<component name="ChangeListManager"> | <component name="ChangeListManager"> | ||||
<list default="true" id="4f7dccd9-8f92-4a6e-90cc-33890d102263" name="Changes" comment="Changes"> | <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$/.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/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> | </list> | ||||
<option name="SHOW_DIALOG" value="false" /> | <option name="SHOW_DIALOG" value="false" /> | ||||
<option name="HIGHLIGHT_CONFLICTS" value="true" /> | <option name="HIGHLIGHT_CONFLICTS" value="true" /> | ||||
<property name="WebServerToolWindowPanel.toolwindow.show.date" value="false" /> | <property name="WebServerToolWindowPanel.toolwindow.show.date" value="false" /> | ||||
<property name="WebServerToolWindowPanel.toolwindow.show.permissions" value="false" /> | <property name="WebServerToolWindowPanel.toolwindow.show.permissions" value="false" /> | ||||
<property name="WebServerToolWindowPanel.toolwindow.show.size" 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.eslint" value="true" /> | ||||
<property name="node.js.detected.package.tslint" value="true" /> | <property name="node.js.detected.package.tslint" value="true" /> | ||||
<property name="node.js.selected.package.eslint" value="(autodetect)" /> | <property name="node.js.selected.package.eslint" value="(autodetect)" /> | ||||
</component> | </component> | ||||
<component name="RecentsManager"> | <component name="RecentsManager"> | ||||
<key name="CopyFile.RECENT_KEYS"> | <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\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\test\ffmpeg11" /> | ||||
<recent name="D:\work\alg\tuoheng_alg\data" /> | <recent name="D:\work\alg\tuoheng_alg\data" /> | ||||
<recent name="D:\work\alg\tuoheng_alg\test" /> | |||||
</key> | </key> | ||||
<key name="MoveFile.RECENT_KEYS"> | <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\test\水印" /> | ||||
<recent name="D:\work\alg\tuoheng_alg\image" /> | <recent name="D:\work\alg\tuoheng_alg\image" /> | ||||
</key> | </key> | ||||
</component> | </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" /> | <module name="tuoheng_alg" /> | ||||
<option name="INTERPRETER_OPTIONS" value="" /> | <option name="INTERPRETER_OPTIONS" value="" /> | ||||
<option name="PARENT_ENVS" value="true" /> | <option name="PARENT_ENVS" value="true" /> | ||||
<envs> | <envs> | ||||
<env name="PYTHONUNBUFFERED" value="1" /> | <env name="PYTHONUNBUFFERED" value="1" /> | ||||
</envs> | </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="IS_MODULE_SDK" value="false" /> | ||||
<option name="ADD_CONTENT_ROOTS" value="true" /> | <option name="ADD_CONTENT_ROOTS" value="true" /> | ||||
<option name="ADD_SOURCE_ROOTS" value="true" /> | <option name="ADD_SOURCE_ROOTS" value="true" /> | ||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> | <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="PARAMETERS" value="" /> | ||||
<option name="SHOW_COMMAND_LINE" value="false" /> | <option name="SHOW_COMMAND_LINE" value="false" /> | ||||
<option name="EMULATE_TERMINAL" value="false" /> | <option name="EMULATE_TERMINAL" value="false" /> | ||||
<option name="INPUT_FILE" value="" /> | <option name="INPUT_FILE" value="" /> | ||||
<method v="2" /> | <method v="2" /> | ||||
</configuration> | </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" /> | <module name="tuoheng_alg" /> | ||||
<option name="INTERPRETER_OPTIONS" value="" /> | <option name="INTERPRETER_OPTIONS" value="" /> | ||||
<option name="PARENT_ENVS" value="true" /> | <option name="PARENT_ENVS" value="true" /> | ||||
<envs> | <envs> | ||||
<env name="PYTHONUNBUFFERED" value="1" /> | <env name="PYTHONUNBUFFERED" value="1" /> | ||||
</envs> | </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="IS_MODULE_SDK" value="false" /> | ||||
<option name="ADD_CONTENT_ROOTS" value="true" /> | <option name="ADD_CONTENT_ROOTS" value="true" /> | ||||
<option name="ADD_SOURCE_ROOTS" value="true" /> | <option name="ADD_SOURCE_ROOTS" value="true" /> | ||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> | <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="PARAMETERS" value="" /> | ||||
<option name="SHOW_COMMAND_LINE" value="false" /> | <option name="SHOW_COMMAND_LINE" value="false" /> | ||||
<option name="EMULATE_TERMINAL" value="false" /> | <option name="EMULATE_TERMINAL" value="false" /> | ||||
<option name="INPUT_FILE" value="" /> | <option name="INPUT_FILE" value="" /> | ||||
<method v="2" /> | <method v="2" /> | ||||
</configuration> | </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" /> | <module name="tuoheng_alg" /> | ||||
<option name="INTERPRETER_OPTIONS" value="" /> | <option name="INTERPRETER_OPTIONS" value="" /> | ||||
<option name="PARENT_ENVS" value="true" /> | <option name="PARENT_ENVS" value="true" /> | ||||
<option name="ADD_CONTENT_ROOTS" value="true" /> | <option name="ADD_CONTENT_ROOTS" value="true" /> | ||||
<option name="ADD_SOURCE_ROOTS" value="true" /> | <option name="ADD_SOURCE_ROOTS" value="true" /> | ||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> | <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="PARAMETERS" value="" /> | ||||
<option name="SHOW_COMMAND_LINE" value="false" /> | <option name="SHOW_COMMAND_LINE" value="false" /> | ||||
<option name="EMULATE_TERMINAL" value="false" /> | <option name="EMULATE_TERMINAL" value="false" /> | ||||
<option name="INPUT_FILE" value="" /> | <option name="INPUT_FILE" value="" /> | ||||
<method v="2" /> | <method v="2" /> | ||||
</configuration> | </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" /> | <module name="tuoheng_alg" /> | ||||
<option name="INTERPRETER_OPTIONS" value="" /> | <option name="INTERPRETER_OPTIONS" value="" /> | ||||
<option name="PARENT_ENVS" value="true" /> | <option name="PARENT_ENVS" value="true" /> | ||||
<envs> | <envs> | ||||
<env name="PYTHONUNBUFFERED" value="1" /> | <env name="PYTHONUNBUFFERED" value="1" /> | ||||
</envs> | </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_CONTENT_ROOTS" value="true" /> | ||||
<option name="ADD_SOURCE_ROOTS" value="true" /> | <option name="ADD_SOURCE_ROOTS" value="true" /> | ||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> | <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="PARAMETERS" value="" /> | ||||
<option name="SHOW_COMMAND_LINE" value="false" /> | <option name="SHOW_COMMAND_LINE" value="false" /> | ||||
<option name="EMULATE_TERMINAL" value="false" /> | <option name="EMULATE_TERMINAL" value="false" /> | ||||
<option name="INPUT_FILE" value="" /> | <option name="INPUT_FILE" value="" /> | ||||
<method v="2" /> | <method v="2" /> | ||||
</configuration> | </configuration> | ||||
<configuration name="producer_start1" type="PythonConfigurationType" factoryName="Python" temporary="true"> | |||||
<configuration name="mysqltest" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true"> | |||||
<module name="tuoheng_alg" /> | <module name="tuoheng_alg" /> | ||||
<option name="INTERPRETER_OPTIONS" value="" /> | <option name="INTERPRETER_OPTIONS" value="" /> | ||||
<option name="PARENT_ENVS" value="true" /> | <option name="PARENT_ENVS" value="true" /> | ||||
<envs> | <envs> | ||||
<env name="PYTHONUNBUFFERED" value="1" /> | <env name="PYTHONUNBUFFERED" value="1" /> | ||||
</envs> | </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_CONTENT_ROOTS" value="true" /> | ||||
<option name="ADD_SOURCE_ROOTS" value="true" /> | <option name="ADD_SOURCE_ROOTS" value="true" /> | ||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> | <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="PARAMETERS" value="" /> | ||||
<option name="SHOW_COMMAND_LINE" value="false" /> | <option name="SHOW_COMMAND_LINE" value="false" /> | ||||
<option name="EMULATE_TERMINAL" value="false" /> | <option name="EMULATE_TERMINAL" value="false" /> | ||||
<method v="2" /> | <method v="2" /> | ||||
</configuration> | </configuration> | ||||
<list> | <list> | ||||
<item itemvalue="Python.editImage" /> | |||||
<item itemvalue="Python.mysqltest" /> | <item itemvalue="Python.mysqltest" /> | ||||
<item itemvalue="Python.aa" /> | |||||
<item itemvalue="Python.producer_start1" /> | |||||
<item itemvalue="Python.test" /> | <item itemvalue="Python.test" /> | ||||
<item itemvalue="Python.ffmpeg12" /> | <item itemvalue="Python.ffmpeg12" /> | ||||
<item itemvalue="Python.ffmpeg13" /> | <item itemvalue="Python.ffmpeg13" /> | ||||
<item itemvalue="Python.ImgBaiduSdk" /> | |||||
</list> | </list> | ||||
<recent_temporary> | <recent_temporary> | ||||
<list> | <list> | ||||
<item itemvalue="Python.ImgBaiduSdk" /> | |||||
<item itemvalue="Python.ffmpeg13" /> | <item itemvalue="Python.ffmpeg13" /> | ||||
<item itemvalue="Python.ffmpeg12" /> | <item itemvalue="Python.ffmpeg12" /> | ||||
<item itemvalue="Python.test" /> | <item itemvalue="Python.test" /> | ||||
<item itemvalue="Python.producer_start1" /> | |||||
<item itemvalue="Python.aa" /> | |||||
</list> | </list> | ||||
</recent_temporary> | </recent_temporary> | ||||
</component> | </component> | ||||
<workItem from="1677632498068" duration="4279000" /> | <workItem from="1677632498068" duration="4279000" /> | ||||
<workItem from="1677654510460" duration="2082000" /> | <workItem from="1677654510460" duration="2082000" /> | ||||
<workItem from="1677727307545" duration="438000" /> | <workItem from="1677727307545" duration="438000" /> | ||||
<workItem from="1678153491396" duration="9573000" /> | |||||
<workItem from="1678253386456" duration="45394000" /> | |||||
</task> | </task> | ||||
<servers /> | <servers /> | ||||
</component> | </component> | ||||
<component name="com.intellij.coverage.CoverageDataManagerImpl"> | <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$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$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$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$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.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$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/协程" /> | <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/协程" /> |
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||||
import asyncio | import asyncio | ||||
import base64 | |||||
import json | import json | ||||
import os | import os | ||||
import sys | |||||
import time | import time | ||||
import copy | import copy | ||||
from concurrent.futures import ThreadPoolExecutor, as_completed | from concurrent.futures import ThreadPoolExecutor, as_completed | ||||
import cv2 | import cv2 | ||||
import numpy as np | |||||
from PIL import Image, ImageDraw, ImageFont | |||||
from common import Constant | from common import Constant | ||||
from multiprocessing import Process, Queue | from multiprocessing import Process, Queue | ||||
from loguru import logger | from loguru import logger | ||||
from concurrency.FileUpdateThread import build_image_name | from concurrency.FileUpdateThread import build_image_name | ||||
from concurrency.HeartbeatThread import Heartbeat | |||||
from concurrency.PullVideoStreamProcess import OnlinePullVideoStreamProcess, OfflinePullVideoStreamProcess | from concurrency.PullVideoStreamProcess import OnlinePullVideoStreamProcess, OfflinePullVideoStreamProcess | ||||
from entity import FeedBack | from entity import FeedBack | ||||
from enums.AnalysisStatusEnum import AnalysisStatus | from enums.AnalysisStatusEnum import AnalysisStatus | ||||
from enums.AnalysisTypeEnum import AnalysisType | from enums.AnalysisTypeEnum import AnalysisType | ||||
from enums.ExceptionEnum import ExceptionType | from enums.ExceptionEnum import ExceptionType | ||||
from enums.ModelTypeEnum import ModelType | 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.AliyunSdk import AliyunOssSdk | ||||
from util.Cv2Utils import Cv2Util | from util.Cv2Utils import Cv2Util | ||||
from entity.FeedBack import message_feedback | from entity.FeedBack import message_feedback | ||||
from exception.CustomerException import ServiceException | from exception.CustomerException import ServiceException | ||||
from util.ImageUtils import PictureWaterMark, url2Array | from util.ImageUtils import PictureWaterMark, url2Array | ||||
from util.OcrBaiduSdk import OcrBaiduSdk | 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): | class IntelligentRecognitionProcess(Process): | ||||
def __init__(self, cfg): | def __init__(self, cfg): | ||||
pullProcess.sendCommand({"command": "stop_pull_stream"}) | pullProcess.sendCommand({"command": "stop_pull_stream"}) | ||||
if not os.path.exists(self.orFilePath) or not os.path.exists(self.aiFilePath): | if not os.path.exists(self.orFilePath) or not os.path.exists(self.aiFilePath): | ||||
logger.error("原视频或AI视频不存在!requestId:{}", self.msg.get("request_id")) | 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")) | 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) | 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")) | params2 = (self.aiFilePath, "aiOnLineVideo", self.content, logger, self.msg.get("request_id")) | ||||
# 程序开始时间 | # 程序开始时间 | ||||
LogUtils.init_log(self.content) | LogUtils.init_log(self.content) | ||||
self.sendhbMessage(AnalysisStatus.WAITING.value, "0.0000", AnalysisType.ONLINE.value) | 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) | self.imageQueue) | ||||
pullProcess.daemon = True | pullProcess.daemon = True | ||||
pullProcess.start() | pullProcess.start() | ||||
if r[1] is None or not r[1]: | if r[1] is None or not r[1]: | ||||
t.shutdown(wait=False) | t.shutdown(wait=False) | ||||
loop.close() | 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: | if p_result[2] is not None and len(p_result[2]) > 0: | ||||
for ai_analyse_result in p_result[2]: | for ai_analyse_result in p_result[2]: | ||||
order = str(int(ai_analyse_result[0])) | order = str(int(ai_analyse_result[0])) | ||||
pullProcess.sendCommand({"command": "stop_pull_stream"}) | pullProcess.sendCommand({"command": "stop_pull_stream"}) | ||||
if not os.path.exists(self.aiFilePath): | if not os.path.exists(self.aiFilePath): | ||||
logger.error("AI视频不存在!requestId:{}", self.msg.get("request_id")) | 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")) | 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 = Common(content=self.content, func=AliyunSdk.get_play_url, args=params2) | ||||
ai_update_thread.setDaemon(True) | ai_update_thread.setDaemon(True) | ||||
# 程序开始时间 | # 程序开始时间 | ||||
LogUtils.init_log(self.content) | LogUtils.init_log(self.content) | ||||
self.sendhbMessage(AnalysisStatus.WAITING.value, "0.0000", AnalysisType.OFFLINE.value) | 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) | self.imageQueue) | ||||
pullProcess.daemon = True | pullProcess.daemon = True | ||||
pullProcess.start() | pullProcess.start() | ||||
if r[1] is None or not r[1]: | if r[1] is None or not r[1]: | ||||
t.shutdown(wait=False) | t.shutdown(wait=False) | ||||
loop.close() | 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( | task_process = str(format( | ||||
float(frame_all[0].get("cct_frame")) / float(frame_all[0].get("all_frame")), | float(frame_all[0].get("cct_frame")) / float(frame_all[0].get("all_frame")), | ||||
'.4f')) | '.4f')) | ||||
# logger.info("算法模型调度时间:{}s, requestId:{}", time.time() - time00, self.msg.get("request_id")) | # logger.info("算法模型调度时间:{}s, requestId:{}", time.time() - time00, self.msg.get("request_id")) | ||||
# 原视频保存本地、AI视频保存本地 | # 原视频保存本地、AI视频保存本地 | ||||
if content["video"]["video_add_water"]: | 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) | p_result[1] = pic.common_water_1(p_result[1], pic.logo) | ||||
aliyunOssSdk = AliyunOssSdk(content, logger, msg.get("request_id")) | aliyunOssSdk = AliyunOssSdk(content, logger, msg.get("request_id")) | ||||
aliyunOssSdk.get_oss_bucket() | aliyunOssSdk.get_oss_bucket() | ||||
loop = asyncio.new_event_loop() | loop = asyncio.new_event_loop() | ||||
asyncio.set_event_loop(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] | ai_image = cv2.imencode(".jpg", p_result[1])[1] | ||||
# 定义上传图片名称 | # 定义上传图片名称 | ||||
random_num = TimeUtils.now_date_to_str(TimeUtils.YMDHMSF) | random_num = TimeUtils.now_date_to_str(TimeUtils.YMDHMSF) | ||||
time_now = TimeUtils.now_date_to_str("%Y-%m-%d-%H-%M-%S") | 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: | 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, | 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") | 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 = [] | order = [] | ||||
for ai_analyse_result in p_result[2]: | for ai_analyse_result in p_result[2]: | ||||
order.append(str(int(ai_analyse_result[0]))) | order.append(str(int(ai_analyse_result[0]))) | ||||
AnalysisStatus.RUNNING.value, | AnalysisStatus.RUNNING.value, | ||||
AnalysisType.IMAGE.value, "", "", | AnalysisType.IMAGE.value, "", "", | ||||
'', | '', | ||||
or_image_name, | |||||
# or_image_name, | |||||
imageUrl, | |||||
ai_image_name, | ai_image_name, | ||||
model_type_code, | model_type_code, | ||||
",".join(set(order)), | ",".join(set(order)), | ||||
else: | else: | ||||
carCode = result.get("words_result").get("number") | carCode = result.get("words_result").get("number") | ||||
if len(carCode) > 0: | 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'), | fbQueue.put({"feedback": FeedBack.message_feedback(msg.get('request_id'), | ||||
AnalysisStatus.RUNNING.value, | AnalysisStatus.RUNNING.value, | ||||
AnalysisType.IMAGE.value, "", "", | AnalysisType.IMAGE.value, "", "", | ||||
cityRecognition = city.get("words_result") | cityRecognition = city.get("words_result") | ||||
if len(phoneNumberRecognition) > 0 or len(cityRecognition) > 0: | if len(phoneNumberRecognition) > 0 or len(cityRecognition) > 0: | ||||
trip_result = {'type': str(1), | trip_result = {'type': str(1), | ||||
'modelCode': model_type_code, | |||||
'imageUrl': imageUrl, | 'imageUrl': imageUrl, | ||||
'phoneNumberRecognition': phoneNumberRecognition, | 'phoneNumberRecognition': phoneNumberRecognition, | ||||
'phone_sorce': phone_score, | 'phone_sorce': phone_score, | ||||
hsRecognition = hs.get("words_result") | hsRecognition = hs.get("words_result") | ||||
if len(nameRecognition) > 0 or len(phoneNumberRecognition) > 0 or len(hsRecognition) > 0: | if len(nameRecognition) > 0 or len(phoneNumberRecognition) > 0 or len(hsRecognition) > 0: | ||||
healthy_result = {'type': str(2), | healthy_result = {'type': str(2), | ||||
'modelCode': model_type_code, | |||||
'imageUrl': imageUrl, | 'imageUrl': imageUrl, | ||||
'color': dataBack.get("color"), | 'color': dataBack.get("color"), | ||||
'nameRecognition': nameRecognition, | 'nameRecognition': nameRecognition, | ||||
logger.exception("模型分析异常: {}, requestId: {}", e, msg.get("request_id")) | logger.exception("模型分析异常: {}, requestId: {}", e, msg.get("request_id")) | ||||
return False | 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 | |||||
''' | ''' | ||||
图片识别 | 图片识别 | ||||
result = False | result = False | ||||
return result | 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): | def run(self): | ||||
try: | try: | ||||
# 初始化日志 | # 初始化日志 | ||||
AnalysisType.IMAGE.value, | AnalysisType.IMAGE.value, | ||||
progress='0.0000', | progress='0.0000', | ||||
analyse_time=TimeUtils.now_date_to_str())}) | 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") | 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) | result = self.epidemicPrevention(imageUrls, mod, model_type_code) | ||||
elif model_type_code == ModelType.PLATE_MODEL.value[1]: | elif model_type_code == ModelType.PLATE_MODEL.value[1]: | ||||
result = self.epidemicPrevention(imageUrls, mod, model_type_code) | result = self.epidemicPrevention(imageUrls, mod, model_type_code) | ||||
def get_model(args): | def get_model(args): | ||||
logger.info("######################开始加载模型######################") | 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]: | for model in args[1]: | ||||
try: | try: | ||||
code = model.get("code") | code = model.get("code") | ||||
needed_objectsIndex = [int(category.get("id")) for category in model.get("categories")] | needed_objectsIndex = [int(category.get("id")) for category in model.get("categories")] | ||||
logger.info("code:{}, 检查目标:{}, gpuId:{}", code, needed_objectsIndex, args[0]) | 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: | 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: | else: | ||||
logger.error("未匹配到对应的模型") | logger.error("未匹配到对应的模型") | ||||
raise ServiceException(ExceptionType.AI_MODEL_MATCH_EXCEPTION.value[0], | raise ServiceException(ExceptionType.AI_MODEL_MATCH_EXCEPTION.value[0], | ||||
ExceptionType.AI_MODEL_MATCH_EXCEPTION.value[1]) | ExceptionType.AI_MODEL_MATCH_EXCEPTION.value[1]) | ||||
except Exception as e: | except Exception as e: | ||||
logger.exception("获取模型配置异常: {}", 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]) |
timeout: 21600 # 一次识别任务超时时间,单位秒,默认6个小时 | timeout: 21600 # 一次识别任务超时时间,单位秒,默认6个小时 | ||||
cv2_pull_stream_timeout: 3600 # 直播开始视频未推流超时时间 | cv2_pull_stream_timeout: 3600 # 直播开始视频未推流超时时间 | ||||
cv2_read_stream_timeout: 1800 # 直播读流中超时时间 | 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: | log: | ||||
# 是否开启文件输出 True:开启 False:关闭 | # 是否开启文件输出 True:开启 False:关闭 |
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 | |||||
} |
@unique | @unique | ||||
class ExceptionType(Enum): | 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资源可以使用,请稍后再试!") | NO_GPU_RESOURCES = ("SP998", "暂无GPU资源可以使用,请稍后再试!") | ||||
SERVICE_INNER_EXCEPTION = ("SP999", "系统内部异常, 请联系工程师定位处理!") | |||||
SERVICE_INNER_EXCEPTION = ("SP999", "系统内部异常!") |
from enum import Enum, unique | from enum import Enum, unique | ||||
# 异常枚举 | # 异常枚举 | ||||
@unique | @unique | ||||
class ModelType(Enum): | class ModelType(Enum): | ||||
WATER_SURFACE_MODEL = ("1", "001", "河道模型", 'river') | WATER_SURFACE_MODEL = ("1", "001", "河道模型", 'river') | ||||
FOREST_FARM_MODEL = ("2", "002", "森林模型", 'forest2') | FOREST_FARM_MODEL = ("2", "002", "森林模型", 'forest2') | ||||
SHIP_MODEL = ("11", "011", "船只模型", 'ship') | SHIP_MODEL = ("11", "011", "船只模型", 'ship') | ||||
BAIDU_MODEL = ("12", "012", "百度AI图片识别模型", None) | |||||
def checkCode(code): | def checkCode(code): | ||||
for model in ModelType: | for model in ModelType: | ||||
if model.value[1] == code: | if model.value[1] == code: | ||||
return True | 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 | |||||
} | |||||
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() | |||||
# 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) |
self.content["aliyun"]["oss"]["bucket"], | self.content["aliyun"]["oss"]["bucket"], | ||||
connect_timeout=self.content["aliyun"]["oss"]["connect_timeout"]) | 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): | async def put_object(self, updatePath, fileByte): | ||||
self.bucket.put_object(updatePath, fileByte) | self.bucket.put_object(updatePath, fileByte) | ||||
self.logger.error("vod视频上传失败,重试次数:{}, requestId:{}", retry_count, self.requestId) | self.logger.error("vod视频上传失败,重试次数:{}, requestId:{}", retry_count, self.requestId) | ||||
if retry_count >= MAX_RETRIES: | if retry_count >= MAX_RETRIES: | ||||
self.logger.exception("vod视频上传重试失败: {}, requestId:{}", e, self.requestId) | 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): | def get_play_url(args): |
def build_write(self): | def build_write(self): | ||||
try: | try: | ||||
if self.fps is None or self.width is None or self.height is None: | 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: | 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, | self.or_video_file = cv2.VideoWriter(self.orFilePath, cv2.VideoWriter_fourcc(*'mp4v'), self.fps, | ||||
(int(self.wn), int(self.hn))) | (int(self.wn), int(self.hn))) | ||||
if self.or_video_file is None: | 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: | 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, | self.ai_video_file = cv2.VideoWriter(self.aiFilePath, cv2.VideoWriter_fourcc(*'mp4v'), self.fps, | ||||
(int(self.wn * 2), int(self.hn))) | (int(self.wn * 2), int(self.hn))) | ||||
if self.ai_video_file is None: | 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: | except ServiceException as s: | ||||
logger.exception("构建文件写对象异常: {}, requestId:{}", s, self.requestId) | logger.exception("构建文件写对象异常: {}, requestId:{}", s, self.requestId) | ||||
raise s | raise s | ||||
def getP(self): | def getP(self): | ||||
if self.p is None: | if self.p is None: | ||||
logger.error("获取管道为空, requestId:{}", self.requestId) | 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 | 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): | def getOrVideoFile(self): | ||||
if self.or_video_file is None: | if self.or_video_file is None: | ||||
logger.error("获取原视频写入对象为空, requestId:{}", self.requestId) | 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 | return self.or_video_file | ||||
def getAiVideoFile(self): | def getAiVideoFile(self): | ||||
if self.ai_video_file is None: | if self.ai_video_file is None: | ||||
logger.error("获取AI视频写入对象为空, requestId:{}", self.requestId) | 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 | return self.ai_video_file |
dst_channels[i][ul_points[0]: dr_points[0], ul_points[1]: dr_points[1]] = dst_channels[i][ | 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[0]: dr_points[0], | ||||
ul_points[1]: dr_points[1]] * ( | 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( | 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) | mask_channels[i] * (mask_channels[3] * alpha / 255), dtype=np.uint8) | ||||
dst_img = cv2.merge(dst_channels) | dst_img = cv2.merge(dst_channels) | ||||
return dst_img | return dst_img | ||||
#差值感知算法 | |||||
# 差值感知算法 | |||||
def dHash(image): | 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) | # print(image.shape) | ||||
hash=[] | |||||
#每行前一个像素大于后一个像素为1,相反为0,生成哈希 | |||||
hash = [] | |||||
# 每行前一个像素大于后一个像素为1,相反为0,生成哈希 | |||||
for i in range(8): | for i in range(8): | ||||
for j 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) | hash.append(1) | ||||
else: | else: | ||||
hash.append(0) | hash.append(0) | ||||
return hash | return hash | ||||
#计算汉明距离 | |||||
def Hamming_distance(hash1,hash2): | |||||
# 计算汉明距离 | |||||
def Hamming_distance(hash1, hash2): | |||||
num = 0 | num = 0 | ||||
for index in range(len(hash1)): | for index in range(len(hash1)): | ||||
if hash1[index] != hash2[index]: | if hash1[index] != hash2[index]: | ||||
num += 1 | num += 1 | ||||
return num | return num | ||||
def url2Array(url): | def url2Array(url): | ||||
response = requests.get(url) | response = requests.get(url) | ||||
image = Image.open(BytesIO(response.content)) | image = Image.open(BytesIO(response.content)) | ||||
img_bgr = cv2.cvtColor(image1, cv2.COLOR_RGB2BGR) | img_bgr = cv2.cvtColor(image1, cv2.COLOR_RGB2BGR) | ||||
return img_bgr | 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() |
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) |
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||||
import base64 | |||||
import sys | 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.GPUtils import get_all_gpu_ids | ||||
from util.ImgBaiduSdk import AipBodyAnalysisClient, AipImageClassifyClient | |||||
sys.path.extend(['..', '../AIlib2']) | 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 segutils.segmodel import SegModel | ||||
from models.experimental import attempt_load | from models.experimental import attempt_load | ||||
from utils.torch_utils import select_device | 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 numpy as np | ||||
import torch,glob | |||||
import torch, glob | |||||
import tensorrt as trt | import tensorrt as trt | ||||
from utilsK.masterUtils import get_needed_objectsIndex | 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: | 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: | try: | ||||
logger.info("########################加载{}########################, requestId:{}", modeType.value[2], requestId) | |||||
logger.info("########################加载{}########################, requestId:{}", modeType.value[2], | |||||
requestId) | |||||
self.modeType = modeType | self.modeType = modeType | ||||
self.allowedList = allowedList | self.allowedList = allowedList | ||||
self.trtFlag_det = True, # 检测模型是否采用TRT | self.trtFlag_det = True, # 检测模型是否采用TRT | ||||
'segPar': { | 'segPar': { | ||||
'modelSize': (640, 360), | 'modelSize': (640, 360), | ||||
'mean': (0.485, 0.456, 0.406), | 'mean': (0.485, 0.456, 0.406), | ||||
'std' : (0.229, 0.224, 0.225), | |||||
'std': (0.229, 0.224, 0.225), | |||||
'numpy': False, | 'numpy': False, | ||||
'RGB_convert_first': True | 'RGB_convert_first': True | ||||
}, # 分割模型预处理参数 | }, # 分割模型预处理参数 | ||||
Detweights = par.get('Detweights') # 升级后的检测模型 | Detweights = par.get('Detweights') # 升级后的检测模型 | ||||
if self.trtFlag_det: | if self.trtFlag_det: | ||||
with open(Detweights, "rb") as f, trt.Runtime(trt.Logger(trt.Logger.ERROR)) as runtime: | 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: | else: | ||||
self.model = attempt_load(Detweights, map_location=self.device) # load FP32 model | self.model = attempt_load(Detweights, map_location=self.device) # load FP32 model | ||||
if self.half: | if self.half: | ||||
logger.exception("异常:{}, requestId:{}", ee, requestId) | logger.exception("异常:{}, requestId:{}", ee, requestId) | ||||
raise ee | raise ee | ||||
def process(self, frame, width=1920): | def process(self, frame, width=1920): | ||||
if self.label_arraylist is None: | if self.label_arraylist is None: | ||||
fontsize = int(width / 1920 * 40) | fontsize = int(width / 1920 * 40) | ||||
self.rainbows, self.half, self.device, self.conf_thres, self.iou_thres, | self.rainbows, self.half, self.device, self.conf_thres, self.iou_thres, | ||||
self.allowedList, font=self.digitFont, trtFlag_det=self.trtFlag_det) | self.allowedList, font=self.digitFont, trtFlag_det=self.trtFlag_det) | ||||
# # 河道模型 | # # 河道模型 | ||||
# class SZModel: | # class SZModel: | ||||
# def __init__(self, device, allowedList=None, logger=None, requestId=None): | # def __init__(self, device, allowedList=None, logger=None, requestId=None): | ||||
# 车牌分割模型、健康码、行程码分割模型 | # 车牌分割模型、健康码、行程码分割模型 | ||||
class IMModel: | 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) | logger.info("########################加载{}########################, requestId:{}", modeType.value[2], requestId) | ||||
self.allowedList = allowedList | self.allowedList = allowedList | ||||
if ModelType.EPIDEMIC_PREVENTION_MODEL == modeType: | if ModelType.EPIDEMIC_PREVENTION_MODEL == modeType: | ||||
self.img_type = 'code' ## code,plate | self.img_type = 'code' ## code,plate | ||||
if ModelType.PLATE_MODEL == modeType: | if ModelType.PLATE_MODEL == modeType: | ||||
self.img_type = 'plate' ## code,plate | 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.device = torch.device(self.par['device']) | ||||
self.model = torch.jit.load(self.par[self.img_type]['weights']) | self.model = torch.jit.load(self.par[self.img_type]['weights']) | ||||
boxes = post_process(pred, padInfos, self.device, conf_thres=self.par['conf_thres'], | 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']) # 后处理 | 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']) | 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]) | |||||
} |
# self.lock = Lock() | # self.lock = Lock() | ||||
def init_client(self): | 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"]) | |||||
''' | ''' | ||||
{ | { | ||||
] | ] | ||||
} | } | ||||
''' | ''' | ||||
def universal_text_recognition(self, image, request_id): | def universal_text_recognition(self, image, request_id): | ||||
# try: | # try: | ||||
# self.lock.acquire() | # self.lock.acquire() | ||||
# ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1]) | # ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1]) | ||||
# finally: | # finally: | ||||
# self.lock.release() | # self.lock.release() | ||||
''' | ''' | ||||
{ | { | ||||
"log_id": 3583925545, | "log_id": 3583925545, | ||||
} | } | ||||
} | } | ||||
''' | ''' | ||||
def license_plate_recognition(self, image, request_id): | def license_plate_recognition(self, image, request_id): | ||||
# try: | # try: | ||||
# self.lock.acquire() | # self.lock.acquire() | ||||
# ExceptionType.ABNORMAL_LICENSE_PLATE_RECOGNITION.value[1]) | # ExceptionType.ABNORMAL_LICENSE_PLATE_RECOGNITION.value[1]) | ||||
# finally: | # finally: | ||||
# self.lock.release() | # self.lock.release() | ||||