Quellcode durchsuchen

车辆检测、人流量检查、人识别

tags/V2.7.3^2
chenyukun vor 1 Jahr
Ursprung
Commit
80557c5e0b
27 geänderte Dateien mit 978 neuen und 249 gelöschten Zeilen
  1. +1
    -2
      .idea/deployment.xml
  2. +45
    -28
      .idea/workspace.xml
  3. BIN
      common/__pycache__/Constant.cpython-310.pyc
  4. BIN
      common/__pycache__/__init__.cpython-310.pyc
  5. +190
    -54
      concurrency/IntelligentRecognitionProcess.py
  6. +16
    -4
      dsp_application.yml
  7. +175
    -0
      enums/BaiduSdkEnum.py
  8. +16
    -42
      enums/ExceptionEnum.py
  9. +28
    -3
      enums/ModelTypeEnum.py
  10. BIN
      enums/__pycache__/BaiduSdkEnum.cpython-310.pyc
  11. BIN
      enums/__pycache__/ExceptionEnum.cpython-310.pyc
  12. BIN
      enums/__pycache__/__init__.cpython-310.pyc
  13. BIN
      exception/__pycache__/CustomerException.cpython-310.pyc
  14. BIN
      exception/__pycache__/__init__.cpython-310.pyc
  15. +0
    -0
      font/__init__.py
  16. +0
    -0
      test/editimage/__init__.py
  17. +45
    -0
      test/editimage/editImage.py
  18. +6
    -26
      test/str/test.py
  19. +21
    -2
      util/AliyunSdk.py
  20. +15
    -19
      util/Cv2Utils.py
  21. +80
    -44
      util/ImageUtils.py
  22. +240
    -0
      util/ImgBaiduSdk.py
  23. +95
    -21
      util/ModelUtils.py
  24. +5
    -4
      util/OcrBaiduSdk.py
  25. BIN
      util/__pycache__/ImageUtils.cpython-310.pyc
  26. BIN
      util/__pycache__/YmlUtils.cpython-310.pyc
  27. BIN
      util/__pycache__/__init__.cpython-310.pyc

+ 1
- 2
.idea/deployment.xml Datei anzeigen

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" autoUpload="Always" serverName="192.168.11.7" remoteFilesAllowedToDisappearOnAutoupload="false">
<component name="PublishConfigData" serverName="192.168.11.7" remoteFilesAllowedToDisappearOnAutoupload="false">
<serverData>
<paths name="10.21">
<serverdata>
@@ -89,6 +89,5 @@
</serverdata>
</paths>
</serverData>
<option name="myAutoUpload" value="ALWAYS" />
</component>
</project>

+ 45
- 28
.idea/workspace.xml Datei anzeigen

@@ -5,8 +5,21 @@
</component>
<component name="ChangeListManager">
<list default="true" id="4f7dccd9-8f92-4a6e-90cc-33890d102263" name="Changes" comment="Changes">
<change beforePath="$PROJECT_DIR$/.idea/deployment.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/deployment.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/concurrency/IntelligentRecognitionProcess.py" beforeDir="false" afterPath="$PROJECT_DIR$/concurrency/IntelligentRecognitionProcess.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/dsp_application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/dsp_application.yml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/enums/ExceptionEnum.py" beforeDir="false" afterPath="$PROJECT_DIR$/enums/ExceptionEnum.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/enums/ModelTypeEnum.py" beforeDir="false" afterPath="$PROJECT_DIR$/enums/ModelTypeEnum.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/test/image/1.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/test/image/11.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/test/image/2.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/test/image/22.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/util/AliyunSdk.py" beforeDir="false" afterPath="$PROJECT_DIR$/util/AliyunSdk.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/util/Cv2Utils.py" beforeDir="false" afterPath="$PROJECT_DIR$/util/Cv2Utils.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/util/ImageUtils.py" beforeDir="false" afterPath="$PROJECT_DIR$/util/ImageUtils.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/util/ModelUtils.py" beforeDir="false" afterPath="$PROJECT_DIR$/util/ModelUtils.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/util/OcrBaiduSdk.py" beforeDir="false" afterPath="$PROJECT_DIR$/util/OcrBaiduSdk.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -132,7 +145,7 @@
<property name="WebServerToolWindowPanel.toolwindow.show.date" value="false" />
<property name="WebServerToolWindowPanel.toolwindow.show.permissions" value="false" />
<property name="WebServerToolWindowPanel.toolwindow.show.size" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/../../code/dsp/tuoheng_dsp" />
<property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.detected.package.tslint" value="true" />
<property name="node.js.selected.package.eslint" value="(autodetect)" />
@@ -146,32 +159,33 @@
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\work\alg_new\tuoheng_alg\test\ffmpeg11" />
<recent name="D:\work\alg_new\tuoheng_alg\enums" />
<recent name="D:\work\alg_new\tuoheng_alg\util" />
<recent name="D:\work\alg_new\tuoheng_alg\test\ffmpeg11" />
<recent name="D:\work\alg\tuoheng_alg\test\ffmpeg11" />
<recent name="D:\work\alg\tuoheng_alg\data" />
<recent name="D:\work\alg\tuoheng_alg\test" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="D:\work\alg_new\tuoheng_alg\test\image" />
<recent name="D:\work\alg\tuoheng_alg\test\水印" />
<recent name="D:\work\alg\tuoheng_alg\image" />
</key>
</component>
<component name="RunManager" selected="Python.ffmpeg13">
<configuration name="aa" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<component name="RunManager" selected="Python.ImgBaiduSdk">
<configuration name="ImgBaiduSdk" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="tuoheng_alg" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="sftp://dell@192.168.10.12:22/home/dell/anaconda3/envs/prod/bin/python3.8" />
<option name="WORKING_DIRECTORY" value="/home/chenyukun/algSch/test/ffmpeg11" />
<option name="SDK_HOME" value="$PROJECT_DIR$/../../../software/anaconda/envs/test/python.exe" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/util" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="/home/chenyukun/algSch/test/ffmpeg11/aa.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/util/ImgBaiduSdk.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
@@ -180,20 +194,20 @@
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="ffmpeg12" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<configuration name="editImage" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
<module name="tuoheng_alg" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="D:\software\anaconda\envs\chenyukun\python.exe" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test/ffmpeg11" />
<option name="SDK_HOME" value="$PROJECT_DIR$/../../../software/anaconda/envs/test/python.exe" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test/editimage" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/ffmpeg11/ffmpeg12.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/editimage/editImage.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
@@ -202,7 +216,7 @@
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="ffmpeg13" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<configuration name="ffmpeg12" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="tuoheng_alg" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
@@ -215,7 +229,7 @@
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/ffmpeg11/ffmpeg13.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/ffmpeg11/ffmpeg12.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
@@ -224,20 +238,20 @@
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="mysqltest" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
<configuration name="ffmpeg13" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="tuoheng_alg" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test" />
<option name="IS_MODULE_SDK" value="true" />
<option name="SDK_HOME" value="D:\software\anaconda\envs\chenyukun\python.exe" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test/ffmpeg11" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/mysqltest.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/ffmpeg11/ffmpeg13.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
@@ -246,20 +260,20 @@
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="producer_start1" type="PythonConfigurationType" factoryName="Python" temporary="true">
<configuration name="mysqltest" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
<module name="tuoheng_alg" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="$PROJECT_DIR$/../../../software/anaconda/envs/test/python.exe" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test/kafka" />
<option name="IS_MODULE_SDK" value="false" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/test" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/kafka/producer_start.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test/mysqltest.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
@@ -291,20 +305,19 @@
<method v="2" />
</configuration>
<list>
<item itemvalue="Python.editImage" />
<item itemvalue="Python.mysqltest" />
<item itemvalue="Python.aa" />
<item itemvalue="Python.producer_start1" />
<item itemvalue="Python.test" />
<item itemvalue="Python.ffmpeg12" />
<item itemvalue="Python.ffmpeg13" />
<item itemvalue="Python.ImgBaiduSdk" />
</list>
<recent_temporary>
<list>
<item itemvalue="Python.ImgBaiduSdk" />
<item itemvalue="Python.ffmpeg13" />
<item itemvalue="Python.ffmpeg12" />
<item itemvalue="Python.test" />
<item itemvalue="Python.producer_start1" />
<item itemvalue="Python.aa" />
</list>
</recent_temporary>
</component>
@@ -409,6 +422,8 @@
<workItem from="1677632498068" duration="4279000" />
<workItem from="1677654510460" duration="2082000" />
<workItem from="1677727307545" duration="438000" />
<workItem from="1678153491396" duration="9573000" />
<workItem from="1678253386456" duration="45394000" />
</task>
<servers />
</component>
@@ -450,8 +465,10 @@
<component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/tuoheng_alg$cv2test1__1_.coverage" NAME="cv2test1 覆盖结果" MODIFIED="1665820653649" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test" />
<SUITE FILE_PATH="coverage/tuoheng_alg$test.coverage" NAME="test 覆盖结果" MODIFIED="1675048794635" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test/str" />
<SUITE FILE_PATH="coverage/tuoheng_alg$ImgBaiduSdk.coverage" NAME="ImgBaiduSdk 覆盖结果" MODIFIED="1678355024003" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/util" />
<SUITE FILE_PATH="coverage/tuoheng_alg$mysqltest.coverage" NAME="mysqltest Coverage Results" MODIFIED="1660868712851" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test" />
<SUITE FILE_PATH="coverage/tuoheng_alg$ffmpeg33.coverage" NAME="ffmpeg33 覆盖结果" MODIFIED="1670489109246" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test/ffmpeg11" />
<SUITE FILE_PATH="coverage/tuoheng_alg$editImage.coverage" NAME="editImage 覆盖结果" MODIFIED="1678348350574" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test/editimage" />
<SUITE FILE_PATH="coverage/tuoheng_alg$asnyc.coverage" NAME="asnyc Coverage Results" MODIFIED="1663459033435" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test" />
<SUITE FILE_PATH="coverage/tuoheng_alg$asnyc__1_.coverage" NAME="asnyc (1) Coverage Results" MODIFIED="1663458917599" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test" />
<SUITE FILE_PATH="coverage/tuoheng_alg$1.coverage" NAME="协程1 覆盖结果" MODIFIED="1667866542122" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test/协程" />

BIN
common/__pycache__/Constant.cpython-310.pyc Datei anzeigen


BIN
common/__pycache__/__init__.cpython-310.pyc Datei anzeigen


+ 190
- 54
concurrency/IntelligentRecognitionProcess.py Datei anzeigen

@@ -1,26 +1,29 @@
# -*- coding: utf-8 -*-
import asyncio
import base64
import json
import os
import sys
import time
import copy
from concurrent.futures import ThreadPoolExecutor, as_completed

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

from common import Constant
from multiprocessing import Process, Queue
from loguru import logger

from concurrency.FileUpdateThread import build_image_name
from concurrency.HeartbeatThread import Heartbeat
from concurrency.PullVideoStreamProcess import OnlinePullVideoStreamProcess, OfflinePullVideoStreamProcess
from entity import FeedBack
from enums.AnalysisStatusEnum import AnalysisStatus
from enums.AnalysisTypeEnum import AnalysisType
from enums.ExceptionEnum import ExceptionType
from enums.ModelTypeEnum import ModelType
from util import LogUtils, TimeUtils, ImageUtils, ModelUtils
from util import LogUtils, TimeUtils, ImageUtils
from util.AliyunSdk import AliyunOssSdk
from util.Cv2Utils import Cv2Util
from entity.FeedBack import message_feedback
@@ -29,7 +32,11 @@ from concurrency.CommonThread import Common
from exception.CustomerException import ServiceException
from util.ImageUtils import PictureWaterMark, url2Array
from util.OcrBaiduSdk import OcrBaiduSdk
from util.ModelUtils import MODEL_CONFIG

from enums.BaiduSdkEnum import VehicleEnumVALUE
from enums.ModelTypeEnum import BaiduModelTarget
sys.path.extend(['..', '../font'])

class IntelligentRecognitionProcess(Process):
def __init__(self, cfg):
@@ -151,9 +158,8 @@ class OnlineIntelligentRecognitionProcess(IntelligentRecognitionProcess):
pullProcess.sendCommand({"command": "stop_pull_stream"})
if not os.path.exists(self.orFilePath) or not os.path.exists(self.aiFilePath):
logger.error("原视频或AI视频不存在!requestId:{}", self.msg.get("request_id"))
raise ServiceException(ExceptionType.VIDEO_ADDRESS_EXCEPTION.value[0],
ExceptionType.VIDEO_ADDRESS_EXCEPTION.value[1])

raise ServiceException(ExceptionType.PUSH_STREAM_TIME_EXCEPTION.value[0],
ExceptionType.PUSH_STREAM_TIME_EXCEPTION.value[1])
params1 = (self.orFilePath, "orOnLineVideo", self.content, logger, self.msg.get("request_id"))
or_update_thread = Common(content=self.content, func=AliyunSdk.get_play_url, args=params1)
params2 = (self.aiFilePath, "aiOnLineVideo", self.content, logger, self.msg.get("request_id"))
@@ -187,9 +193,11 @@ class OnlineIntelligentRecognitionProcess(IntelligentRecognitionProcess):
# 程序开始时间
LogUtils.init_log(self.content)
self.sendhbMessage(AnalysisStatus.WAITING.value, "0.0000", AnalysisType.ONLINE.value)
mod, model_type_code = get_model((str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id")))
mod, model_type_code = get_model(
(str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id"), self.content))
# 结果反馈进程启动
pullProcess = OnlinePullVideoStreamProcess(self.msg, self.content, self.pullQueue, self.fbQueue, self.hbQueue,
pullProcess = OnlinePullVideoStreamProcess(self.msg, self.content, self.pullQueue, self.fbQueue,
self.hbQueue,
self.imageQueue)
pullProcess.daemon = True
pullProcess.start()
@@ -246,8 +254,8 @@ class OnlineIntelligentRecognitionProcess(IntelligentRecognitionProcess):
if r[1] is None or not r[1]:
t.shutdown(wait=False)
loop.close()
raise ServiceException(ExceptionType.WRITE_STREAM_EXCEPTION.value[0],
ExceptionType.WRITE_STREAM_EXCEPTION.value[1])
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
if p_result[2] is not None and len(p_result[2]) > 0:
for ai_analyse_result in p_result[2]:
order = str(int(ai_analyse_result[0]))
@@ -469,8 +477,8 @@ class OfflineIntelligentRecognitionProcess(IntelligentRecognitionProcess):
pullProcess.sendCommand({"command": "stop_pull_stream"})
if not os.path.exists(self.aiFilePath):
logger.error("AI视频不存在!requestId:{}", self.msg.get("request_id"))
raise ServiceException(ExceptionType.VIDEO_ADDRESS_EXCEPTION.value[0],
ExceptionType.VIDEO_ADDRESS_EXCEPTION.value[1])
raise ServiceException(ExceptionType.PUSH_STREAM_TIME_EXCEPTION.value[0],
ExceptionType.PUSH_STREAM_TIME_EXCEPTION.value[1])
params2 = (self.aiFilePath, "aiOffLineVideo", self.content, logger, self.msg.get("request_id"))
ai_update_thread = Common(content=self.content, func=AliyunSdk.get_play_url, args=params2)
ai_update_thread.setDaemon(True)
@@ -498,8 +506,10 @@ class OfflineIntelligentRecognitionProcess(IntelligentRecognitionProcess):
# 程序开始时间
LogUtils.init_log(self.content)
self.sendhbMessage(AnalysisStatus.WAITING.value, "0.0000", AnalysisType.OFFLINE.value)
mod, model_type_code = get_model((str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id")))
pullProcess = OfflinePullVideoStreamProcess(self.msg, self.content, self.pullQueue, self.fbQueue, self.hbQueue,
mod, model_type_code = get_model(
(str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id"), self.content))
pullProcess = OfflinePullVideoStreamProcess(self.msg, self.content, self.pullQueue, self.fbQueue,
self.hbQueue,
self.imageQueue)
pullProcess.daemon = True
pullProcess.start()
@@ -559,9 +569,10 @@ class OfflineIntelligentRecognitionProcess(IntelligentRecognitionProcess):
if r[1] is None or not r[1]:
t.shutdown(wait=False)
loop.close()
raise ServiceException(ExceptionType.WRITE_STREAM_EXCEPTION.value[0],
ExceptionType.WRITE_STREAM_EXCEPTION.value[1])
if frame_all[0].get("cct_frame") % 600 == 0 and float(frame_all[0].get("cct_frame")) <= float(frame_all[0].get("all_frame")):
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
if frame_all[0].get("cct_frame") % 600 == 0 and float(
frame_all[0].get("cct_frame")) <= float(frame_all[0].get("all_frame")):
task_process = str(format(
float(frame_all[0].get("cct_frame")) / float(frame_all[0].get("all_frame")),
'.4f'))
@@ -758,25 +769,26 @@ def image_recognition(imageUrl, mod, content, pic, msg, fbQueue, model_type_code
# logger.info("算法模型调度时间:{}s, requestId:{}", time.time() - time00, self.msg.get("request_id"))
# 原视频保存本地、AI视频保存本地
if content["video"]["video_add_water"]:
frame = pic.common_water_1(image, pic.logo)
# frame = pic.common_water_1(image, pic.logo)
p_result[1] = pic.common_water_1(p_result[1], pic.logo)
aliyunOssSdk = AliyunOssSdk(content, logger, msg.get("request_id"))
aliyunOssSdk.get_oss_bucket()
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
or_image = cv2.imencode(".jpg", frame)[1]
# or_image = cv2.imencode(".jpg", frame)[1]
ai_image = cv2.imencode(".jpg", p_result[1])[1]
# 定义上传图片名称
random_num = TimeUtils.now_date_to_str(TimeUtils.YMDHMSF)
time_now = TimeUtils.now_date_to_str("%Y-%m-%d-%H-%M-%S")
if p_result[2] is not None and len(p_result[2]) > 0:
# 图片名称待后期修改
or_image_name = build_image_name(msg.get('results_base_dir'), time_now, str(0), str(0), random_num,
'image', msg.get('request_id'), "OR")
# or_image_name = build_image_name(msg.get('results_base_dir'), time_now, str(0), str(0), random_num,
# 'image', msg.get('request_id'), "OR")
ai_image_name = build_image_name(msg.get('results_base_dir'), time_now,
str(0), str(0), random_num, 'image', msg.get('request_id'), "AI")
loop.run_until_complete(asyncio.wait([upload_file(aliyunOssSdk, or_image_name, or_image),
upload_file(aliyunOssSdk, ai_image_name, ai_image)]))
# loop.run_until_complete(asyncio.wait([upload_file(aliyunOssSdk, or_image_name, or_image),
# upload_file(aliyunOssSdk, ai_image_name, ai_image)]))
loop.run_until_complete(asyncio.wait([upload_file(aliyunOssSdk, ai_image_name, ai_image)]))
order = []
for ai_analyse_result in p_result[2]:
order.append(str(int(ai_analyse_result[0])))
@@ -785,7 +797,8 @@ def image_recognition(imageUrl, mod, content, pic, msg, fbQueue, model_type_code
AnalysisStatus.RUNNING.value,
AnalysisType.IMAGE.value, "", "",
'',
or_image_name,
# or_image_name,
imageUrl,
ai_image_name,
model_type_code,
",".join(set(order)),
@@ -835,7 +848,7 @@ def epidemic_prevention(imageUrl, mod, content, orc, msg, fbQueue, model_type_co
else:
carCode = result.get("words_result").get("number")
if len(carCode) > 0:
plate_result = {'type': str(3), 'carUrl': imageUrl, 'carCode': carCode, 'score': score}
plate_result = {'type': str(3), 'modelCode': model_type_code, 'carUrl': imageUrl, 'carCode': carCode, 'score': score}
fbQueue.put({"feedback": FeedBack.message_feedback(msg.get('request_id'),
AnalysisStatus.RUNNING.value,
AnalysisType.IMAGE.value, "", "",
@@ -876,6 +889,7 @@ def epidemic_prevention(imageUrl, mod, content, orc, msg, fbQueue, model_type_co
cityRecognition = city.get("words_result")
if len(phoneNumberRecognition) > 0 or len(cityRecognition) > 0:
trip_result = {'type': str(1),
'modelCode': model_type_code,
'imageUrl': imageUrl,
'phoneNumberRecognition': phoneNumberRecognition,
'phone_sorce': phone_score,
@@ -929,6 +943,7 @@ def epidemic_prevention(imageUrl, mod, content, orc, msg, fbQueue, model_type_co
hsRecognition = hs.get("words_result")
if len(nameRecognition) > 0 or len(phoneNumberRecognition) > 0 or len(hsRecognition) > 0:
healthy_result = {'type': str(2),
'modelCode': model_type_code,
'imageUrl': imageUrl,
'color': dataBack.get("color"),
'nameRecognition': nameRecognition,
@@ -953,6 +968,134 @@ def epidemic_prevention(imageUrl, mod, content, orc, msg, fbQueue, model_type_co
logger.exception("模型分析异常: {}, requestId: {}", e, msg.get("request_id"))
return False

def mark(content, info, img, color):
# score = info.get("probability")
# if score is None:
# score = info.get("location").get("score")
# text = "%s: %.2f]" % (content, score)
# text_xy = (info.get("location").get("left"), info.get("location").get("top") - 30)
img_lu = (info.get("location").get("left"), info.get("location").get("top"))
img_rd = (info.get("location").get("left") + info.get("location").get("width"),
info.get("location").get("top") + info.get("location").get("height"))
# cv2.putText(img, text, text_xy, cv2.FONT_HERSHEY_SIMPLEX, 1.0, color, 1, cv2.LINE_AA)
count = 1
if img.shape[1] > 1600:
count = 2
cv2.rectangle(img, img_lu, img_rd, color, count)
return img


def baidu_recognition(imageUrl, mod, msg, content, fbQueue, model_type_code):
try:
# 检查检测目标
if mod.allowedList is None or len(mod.allowedList) == 0:
return True
img = url2Array(imageUrl)
aliyunOssSdk = AliyunOssSdk(content, logger, msg.get('request_id'))
aliyunOssSdk.get_oss_bucket()
for target in mod.allowedList:
result = mod.process(target, imageUrl)
if target == BaiduModelTarget.VEHICLE_DETECTION.value[1] and result is not None:
vehicleInfo = result.get("vehicle_info")
if vehicleInfo is not None and len(vehicleInfo) > 0:
aiIamge = None
for i, info in enumerate(vehicleInfo):
value = VehicleEnumVALUE.get(info.get("type"))
if value is None:
logger.error("车辆识别出现未支持的目标类型!type:{}, requestId:{}", info.get("type"), msg.get('request_id'))
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
aiIamge = mark("["+str(i) + "][" + value.value[1], info, img, (255, 0, 255))
info["id"] = str(i)
if aiIamge is not None and len(aiIamge) > 0:
random_num = TimeUtils.now_date_to_str(TimeUtils.YMDHMSF)
time_now = TimeUtils.now_date_to_str("%Y-%m-%d-%H-%M-%S")
ai_image_name = build_image_name(msg.get('results_base_dir'), time_now,
str(0),
str(0),
random_num,
AnalysisType.IMAGE.value,
msg.get('request_id'), "AI")
ai_result, ai_image = cv2.imencode(".jpg", aiIamge)
aliyunOssSdk.sync_upload_file(ai_image_name, ai_image.tobytes())
result["type"] = str(target)
result["modelCode"] = model_type_code
fbQueue.put({"feedback": FeedBack.message_feedback(msg.get('request_id'),
AnalysisStatus.RUNNING.value,
AnalysisType.IMAGE.value, "", "",
'',
imageUrl,
ai_image_name,
model_type_code,
str(target),
TimeUtils.now_date_to_str(),
json.dumps(result))})
# 人体识别
if target == BaiduModelTarget.HUMAN_DETECTION.value[1] and result is not None:
personInfo = result.get("person_info")
personNum = result.get("person_num")
if personNum is not None and personNum > 0 and personInfo is not None and len(personInfo) > 0:
personImage = None
for i, info in enumerate(personInfo):
personImage = mark("[" + str(i) + "][人", info, img, (255, 0, 0))
info["id"] = str(i)
if personImage is not None and len(personImage) > 0:
random_num = TimeUtils.now_date_to_str(TimeUtils.YMDHMSF)
time_now = TimeUtils.now_date_to_str("%Y-%m-%d-%H-%M-%S")
ai_image_name = build_image_name(msg.get('results_base_dir'), time_now,
str(0),
str(0),
random_num,
AnalysisType.IMAGE.value,
msg.get('request_id'), "AI")
ai_result, ai_image = cv2.imencode(".jpg", personImage)
aliyunOssSdk.sync_upload_file(ai_image_name, ai_image.tobytes())
result["type"] = str(target)
result["modelCode"] = model_type_code
fbQueue.put({"feedback": FeedBack.message_feedback(msg.get('request_id'),
AnalysisStatus.RUNNING.value,
AnalysisType.IMAGE.value, "", "",
'',
imageUrl,
ai_image_name,
model_type_code,
str(target),
TimeUtils.now_date_to_str(),
json.dumps(result))})

# 人流量
if target == BaiduModelTarget.PEOPLE_COUNTING.value[1] and result is not None:
base64Image = result.get("image")
if base64Image is not None and len(base64Image) > 0:
baiduImage = base64.b64decode(base64Image)
random_num = TimeUtils.now_date_to_str(TimeUtils.YMDHMSF)
time_now = TimeUtils.now_date_to_str("%Y-%m-%d-%H-%M-%S")
ai_image_name = build_image_name(msg.get('results_base_dir'), time_now,
str(0),
str(0),
random_num,
AnalysisType.IMAGE.value,
msg.get('request_id'), "AI")
aliyunOssSdk.sync_upload_file(ai_image_name, baiduImage)
result["type"] = str(target)
result["modelCode"] = model_type_code
del result["image"]
fbQueue.put({"feedback": FeedBack.message_feedback(msg.get('request_id'),
AnalysisStatus.RUNNING.value,
AnalysisType.IMAGE.value, "", "",
'',
imageUrl,
ai_image_name,
model_type_code,
str(target),
TimeUtils.now_date_to_str(),
json.dumps(result))})
logger.info("算法分析结果: {}", result)
return True
except Exception as e:
logger.exception("百度AI分析异常: {}, requestId: {}", e, msg.get("request_id"))
return False


'''
图片识别
@@ -990,6 +1133,19 @@ class PhotosIntelligentRecognitionProcess(IntelligentRecognitionProcess):
result = False
return result

def baiduRecognition(self, imageUrls, mod, model_type_code):
result = True
with ThreadPoolExecutor(max_workers=5) as t:
obj_list = []
for imageUrl in imageUrls:
obj = t.submit(baidu_recognition, imageUrl, mod, self.msg, self.content, self.fbQueue, model_type_code)
obj_list.append(obj)
for future in as_completed(obj_list):
data = future.result()
if not data:
result = False
return result

def run(self):
try:
# 初始化日志
@@ -1000,11 +1156,15 @@ class PhotosIntelligentRecognitionProcess(IntelligentRecognitionProcess):
AnalysisType.IMAGE.value,
progress='0.0000',
analyse_time=TimeUtils.now_date_to_str())})

# 加载模型
mod, model_type_code = get_model((str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id")))
mod, model_type_code = get_model(
(str(self.gpu_ids[0]), self.msg["models"], self.msg.get("request_id"), self.content))
# 获取所有图片信息
imageUrls = self.msg.get("image_urls")
if model_type_code == ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]:
if model_type_code == ModelType.BAIDU_MODEL.value[1]:
result = self.baiduRecognition(imageUrls, mod, model_type_code)
elif model_type_code == ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]:
result = self.epidemicPrevention(imageUrls, mod, model_type_code)
elif model_type_code == ModelType.PLATE_MODEL.value[1]:
result = self.epidemicPrevention(imageUrls, mod, model_type_code)
@@ -1054,43 +1214,19 @@ class PhotosIntelligentRecognitionProcess(IntelligentRecognitionProcess):

def get_model(args):
logger.info("######################开始加载模型######################")
model_config = {
# 加载河道模型
ModelType.WATER_SURFACE_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.WATER_SURFACE_MODEL), ModelType.WATER_SURFACE_MODEL.value[1]),
# 加载林场模型
ModelType.FOREST_FARM_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.FOREST_FARM_MODEL), ModelType.FOREST_FARM_MODEL.value[1]),
# 加载交通模型
ModelType.TRAFFIC_FARM_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.TRAFFIC_FARM_MODEL), ModelType.TRAFFIC_FARM_MODEL.value[1]),
# 加载防疫模型
ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.IMModel(x, y, z, r, ModelType.EPIDEMIC_PREVENTION_MODEL), ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]),
# 加载车牌模型
ModelType.PLATE_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.IMModel(x, y, z, r, ModelType.PLATE_MODEL), ModelType.PLATE_MODEL.value[1]),
# 加载车辆模型
ModelType.VEHICLE_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.VEHICLE_MODEL), ModelType.VEHICLE_MODEL.value[1]),
# 加载行人模型
ModelType.PEDESTRIAN_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.PEDESTRIAN_MODEL), ModelType.PEDESTRIAN_MODEL.value[1]),
# 加载烟火模型
ModelType.SMOGFIRE_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.SMOGFIRE_MODEL), ModelType.SMOGFIRE_MODEL.value[1]),
# 加载钓鱼游泳模型
ModelType.ANGLERSWIMMER_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.ANGLERSWIMMER_MODEL), ModelType.ANGLERSWIMMER_MODEL.value[1]),
# 加载乡村模型
ModelType.COUNTRYROAD_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.COUNTRYROAD_MODEL), ModelType.COUNTRYROAD_MODEL.value[1]),
# 加载船只模型
ModelType.SHIP_MODEL.value[1]: (lambda x, y, z, r: ModelUtils.Model(x, y, z, r, ModelType.SHIP_MODEL), ModelType.SHIP_MODEL.value[1])
}
for model in args[1]:
try:
code = model.get("code")
needed_objectsIndex = [int(category.get("id")) for category in model.get("categories")]
logger.info("code:{}, 检查目标:{}, gpuId:{}", code, needed_objectsIndex, args[0])
model_method = model_config.get(code)
model_method = MODEL_CONFIG.get(code)
if model_method is not None:
return model_method[0](args[0], needed_objectsIndex, logger, args[2]), model_method[1]
return model_method[0](args[0], needed_objectsIndex, logger, args[2], args[3]), model_method[1]
else:
logger.error("未匹配到对应的模型")
raise ServiceException(ExceptionType.AI_MODEL_MATCH_EXCEPTION.value[0],
ExceptionType.AI_MODEL_MATCH_EXCEPTION.value[1])
except Exception as e:
logger.exception("获取模型配置异常: {}", e)
raise ServiceException(ExceptionType.AI_MODEL_CONFIG_EXCEPTION.value[0],
ExceptionType.AI_MODEL_CONFIG_EXCEPTION.value[1])
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])

+ 16
- 4
dsp_application.yml Datei anzeigen

@@ -134,10 +134,22 @@ service:
timeout: 21600 # 一次识别任务超时时间,单位秒,默认6个小时
cv2_pull_stream_timeout: 3600 # 直播开始视频未推流超时时间
cv2_read_stream_timeout: 1800 # 直播读流中超时时间
baiduocr:
APP_ID: 28173504
API_KEY: kqrFE7VuygIaFer7z6cRxzoi
SECRET_KEY: yp7xBokyl4TItyGhay7skAN1cMwfvEXf
baidu:
orc:
APP_ID: 28173504
API_KEY: kqrFE7VuygIaFer7z6cRxzoi
SECRET_KEY: yp7xBokyl4TItyGhay7skAN1cMwfvEXf
# 车辆检测
vehicle:
APP_ID: 31096670
API_KEY: Dam3O4tgPRN3qh4OYE82dbg7
SECRET_KEY: 1PGZ9LAXRR5zcT5MN9rHcW8kLBIS5DAa
# 人
person:
APP_ID: 31096755
API_KEY: CiWrt4iyxOly36n3kR7utiAG
SECRET_KEY: K7y6V3XTGdyXvgtCNCwTGUEooxxDuX9v

# 日志设置
log:
# 是否开启文件输出 True:开启 False:关闭

+ 175
- 0
enums/BaiduSdkEnum.py Datei anzeigen

@@ -0,0 +1,175 @@
from enum import Enum, unique

'''
官方文档: https://ai.baidu.com/ai-doc/VEHICLE/rk3inf9tj
参数1: 异常编号
参数2: 异常英文描述
参数3: 异常中文描述
参数4: 0-异常信息统一输出为内部异常
1-异常信息可以输出
2-输出空的异常信息
参数5: 指定异常重试的次数
'''


# 异常枚举
@unique
class BaiduSdkErrorEnum(Enum):

UNKNOWN_ERROR = (1, "Unknown error", "未知错误", 0, 0)

SERVICE_TEMPORARILY_UNAVAILABLE = (2, "Service temporarily unavailable", "服务暂不可用,请再次请求", 0, 3)

UNSUPPORTED_OPENAPI_METHOD = (3, "Unsupported openapi method", "调用的API不存在", 0, 0)

API_REQUEST_LIMIT_REACHED = (4, "Open api request limit reached", "请求量限制, 请稍后再试!", 1, 5)

NO_PERMISSION_TO_ACCESS_DATA = (6, "No permission to access data", "无权限访问该用户数据", 1, 0)

GET_SERVICE_TOKEN_FAILED = (13, "Get service token failed", "获取token失败", 0, 2)

IAM_CERTIFICATION_FAILED = (14, "IAM Certification failed", "IAM 鉴权失败", 0, 2)

APP_NOT_EXSITS_OR_CREATE_FAILED = (15, "app not exsits or create failed", "应用不存在或者创建失败", 0, 0)

API_DAILY_REQUEST_LIMIT_REACHED = (17, "Open api daily request limit reached", "每天请求量超限额!", 1, 5)

API_QPS_REQUEST_LIMIT_REACHED = (18, "Open api qps request limit reached", "QPS超限额!", 1, 5)

API_TOTAL_REQUEST_LIMIT_REACHED = (19, "Open api total request limit reached", "请求总量超限额!", 1, 2)

INVALID_TOKEN = (100, "Invalid parameter", "无效的access_token参数,token拉取失败", 0, 2)

ACCESS_TOKEN_INVALID_OR_NO_LONGER_VALID = (110, "Access token invalid or no longer valid", "access_token无效,token有效期为30天", 0, 2)

ACCESS_TOKEN_EXPIRED = (111, "Access token expired", "access token过期,token有效期为30天", 0, 2)

INTERNAL_ERROR = (282000, "internal error", "服务器内部错误", 0, 1)

INVALID_PARAM = (216100, "invalid param", "请求中包含非法参数!", 0, 0)

NOT_ENOUGH_PARAM = (216101, "not enough param", "缺少必须的参数!", 0, 0)

SERVICE_NOT_SUPPORT = (216102, "service not support", "请求了不支持的服务,请检查调用的url", 0, 0)

PARAM_TOO_LONG = (216103, "param too long", "请求中某些参数过长!", 1, 0)

APPID_NOT_EXIST = (216110, "appid not exist", "appid不存在", 0, 0)

EMPTY_IMAGE = (216200, "empty image", "图片为空!", 1, 0)

IMAGE_FORMAT_ERROR = (216201, "image format error", "上传的图片格式错误,现阶段我们支持的图片格式为:PNG、JPG、JPEG、BMP", 1, 0)

IMAGE_SIZE_ERROR = (216202, "image size error", "上传的图片大小错误,现阶段我们支持的图片大小为:base64编码后小于4M,分辨率不高于4096*4096", 1, 0)

IMAGE_SIZE_BASE_ERROR = (216203, "image size error", "上传的图片base64编码有误", 1, 0)

RECOGNIZE_ERROR = (216630, "recognize error", "识别错误", 2, 3)

DETECT_ERROR = (216634, "detect error", "检测错误", 2, 3)

MISSING_PARAMETERS = (282003, "missing parameters: {参数名}", "请求参数缺失", 0, 0)

BATCH_ROCESSING_ERROR = (282005, "batch processing error", "处理批量任务时发生部分或全部错误", 0, 5)

BATCH_TASK_LIMIT_REACHED = (282006, "batch task limit reached", "批量任务处理数量超出限制,请将任务数量减少到10或10以下", 1, 5)

IMAGE_TRANSCODE_ERROR = (282100, "image transcode error", "图片压缩转码错误", 0, 1)

IMAGE_SPLIT_LIMIT_REACHED = (282101, "image split limit reached", "长图片切分数量超限!", 1, 1)

TARGET_DETECT_ERROR = (282102, "target detect error", "未检测到图片中识别目标!", 2, 1) #

TARGET_RECOGNIZE_ERROR = (282103, "target recognize error", "图片目标识别错误!", 2, 1)

URL_SIZE_ERROR = (282114, "url size error", "URL长度超过1024字节或为0!", 1, 0)

REQUEST_ID_NOT_EXIST = (282808, "request id: xxxxx not exist", "request id xxxxx 不存在", 0, 0)

RESULT_TYPE_ERROR = (282809, "result type error", "返回结果请求错误(不属于excel或json)", 0, 0)

IMAGE_RECOGNIZE_ERROR = (282810, "image recognize error", "图像识别错误", 2, 1)

INVALID_ARGUMENT = (283300, "Invalid argument", "入参格式有误,可检查下图片编码、代码格式是否有误", 1, 0)

INTERNAL_ERROR_2 = (336000, "Internal error", "服务器内部错误", 0, 0)

INVALID_ARGUMENT_2 = (336001, "Invalid Argument", "入参格式有误,比如缺少必要参数、图片base64编码错误等等,可检查下图片编码、代码格式是否有误", 1, 0)

SDK_IMAGE_SIZE_ERROR = ('SDK100', "image size error", "图片大小超限,要求base64编码后大小不超过4M,最短边至少50px,最长边最大4096px ,建议长宽比3:1以内,图片请求格式支持:PNG、JPG、BMP", 1, 0)

SDK_IMAGE_LENGTH_ERROR = ('SDK101', "image length error", "图片边长不符合要求,最短边至少50px,最长边最大4096px ,建议长宽比3:1以内", 1, 0)

SDK_READ_IMAGE_FILE_ERROR = ('SDK102', "read image file error", "读取图片文件错误", 0, 1)

SDK_CONNECTION_OR_READ_DATA_TIME_OUT = ('SDK108', "connection or read data time out", "连接超时或读取数据超时,请检查本地网络设置、文件读取设置", 0, 3)

SDK_UNSUPPORTED_IMAGE_FORMAT = ('SDK109', "unsupported image format", "不支持的图片格式,当前支持以下几类图片:PNG、JPG、BMP", 1, 0)


BAIDUERRORDATA = {
BaiduSdkErrorEnum.UNKNOWN_ERROR.value[0]: BaiduSdkErrorEnum.UNKNOWN_ERROR,
BaiduSdkErrorEnum.SERVICE_TEMPORARILY_UNAVAILABLE.value[0]: BaiduSdkErrorEnum.SERVICE_TEMPORARILY_UNAVAILABLE,
BaiduSdkErrorEnum.UNSUPPORTED_OPENAPI_METHOD.value[0]: BaiduSdkErrorEnum.UNSUPPORTED_OPENAPI_METHOD,
BaiduSdkErrorEnum.API_REQUEST_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.API_REQUEST_LIMIT_REACHED,
BaiduSdkErrorEnum.NO_PERMISSION_TO_ACCESS_DATA.value[0]: BaiduSdkErrorEnum.NO_PERMISSION_TO_ACCESS_DATA,
BaiduSdkErrorEnum.GET_SERVICE_TOKEN_FAILED.value[0]: BaiduSdkErrorEnum.GET_SERVICE_TOKEN_FAILED,
BaiduSdkErrorEnum.IAM_CERTIFICATION_FAILED.value[0]: BaiduSdkErrorEnum.IAM_CERTIFICATION_FAILED,
BaiduSdkErrorEnum.APP_NOT_EXSITS_OR_CREATE_FAILED.value[0]: BaiduSdkErrorEnum.APP_NOT_EXSITS_OR_CREATE_FAILED,
BaiduSdkErrorEnum.API_DAILY_REQUEST_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.API_DAILY_REQUEST_LIMIT_REACHED,
BaiduSdkErrorEnum.API_QPS_REQUEST_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.API_QPS_REQUEST_LIMIT_REACHED,
BaiduSdkErrorEnum.API_TOTAL_REQUEST_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.API_TOTAL_REQUEST_LIMIT_REACHED,
BaiduSdkErrorEnum.INVALID_TOKEN.value[0]: BaiduSdkErrorEnum.INVALID_TOKEN,
BaiduSdkErrorEnum.ACCESS_TOKEN_INVALID_OR_NO_LONGER_VALID.value[0]: BaiduSdkErrorEnum.ACCESS_TOKEN_INVALID_OR_NO_LONGER_VALID,
BaiduSdkErrorEnum.ACCESS_TOKEN_EXPIRED.value[0]: BaiduSdkErrorEnum.ACCESS_TOKEN_EXPIRED,
BaiduSdkErrorEnum.INTERNAL_ERROR.value[0]: BaiduSdkErrorEnum.INTERNAL_ERROR,
BaiduSdkErrorEnum.INVALID_PARAM.value[0]: BaiduSdkErrorEnum.INVALID_PARAM,
BaiduSdkErrorEnum.NOT_ENOUGH_PARAM.value[0]: BaiduSdkErrorEnum.NOT_ENOUGH_PARAM,
BaiduSdkErrorEnum.SERVICE_NOT_SUPPORT.value[0]: BaiduSdkErrorEnum.SERVICE_NOT_SUPPORT,
BaiduSdkErrorEnum.PARAM_TOO_LONG.value[0]: BaiduSdkErrorEnum.PARAM_TOO_LONG,
BaiduSdkErrorEnum.APPID_NOT_EXIST.value[0]: BaiduSdkErrorEnum.APPID_NOT_EXIST,
BaiduSdkErrorEnum.EMPTY_IMAGE.value[0]: BaiduSdkErrorEnum.EMPTY_IMAGE,
BaiduSdkErrorEnum.IMAGE_FORMAT_ERROR.value[0]: BaiduSdkErrorEnum.IMAGE_FORMAT_ERROR,
BaiduSdkErrorEnum.IMAGE_SIZE_ERROR.value[0]: BaiduSdkErrorEnum.IMAGE_SIZE_ERROR,
BaiduSdkErrorEnum.IMAGE_SIZE_BASE_ERROR.value[0]: BaiduSdkErrorEnum.IMAGE_SIZE_BASE_ERROR,
BaiduSdkErrorEnum.RECOGNIZE_ERROR.value[0]: BaiduSdkErrorEnum.RECOGNIZE_ERROR,
BaiduSdkErrorEnum.DETECT_ERROR.value[0]: BaiduSdkErrorEnum.DETECT_ERROR,
BaiduSdkErrorEnum.MISSING_PARAMETERS.value[0]: BaiduSdkErrorEnum.MISSING_PARAMETERS,
BaiduSdkErrorEnum.BATCH_ROCESSING_ERROR.value[0]: BaiduSdkErrorEnum.BATCH_ROCESSING_ERROR,
BaiduSdkErrorEnum.BATCH_TASK_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.BATCH_TASK_LIMIT_REACHED,
BaiduSdkErrorEnum.IMAGE_TRANSCODE_ERROR.value[0]: BaiduSdkErrorEnum.IMAGE_TRANSCODE_ERROR,
BaiduSdkErrorEnum.IMAGE_SPLIT_LIMIT_REACHED.value[0]: BaiduSdkErrorEnum.IMAGE_SPLIT_LIMIT_REACHED,
BaiduSdkErrorEnum.TARGET_DETECT_ERROR.value[0]: BaiduSdkErrorEnum.TARGET_DETECT_ERROR,
BaiduSdkErrorEnum.TARGET_RECOGNIZE_ERROR.value[0]: BaiduSdkErrorEnum.TARGET_RECOGNIZE_ERROR,
BaiduSdkErrorEnum.URL_SIZE_ERROR.value[0]: BaiduSdkErrorEnum.URL_SIZE_ERROR,
BaiduSdkErrorEnum.REQUEST_ID_NOT_EXIST.value[0]: BaiduSdkErrorEnum.REQUEST_ID_NOT_EXIST,
BaiduSdkErrorEnum.RESULT_TYPE_ERROR.value[0]: BaiduSdkErrorEnum.RESULT_TYPE_ERROR,
BaiduSdkErrorEnum.IMAGE_RECOGNIZE_ERROR.value[0]: BaiduSdkErrorEnum.IMAGE_RECOGNIZE_ERROR,
BaiduSdkErrorEnum.INVALID_ARGUMENT.value[0]: BaiduSdkErrorEnum.INVALID_ARGUMENT,
BaiduSdkErrorEnum.INTERNAL_ERROR_2.value[0]: BaiduSdkErrorEnum.INTERNAL_ERROR_2,
BaiduSdkErrorEnum.INVALID_ARGUMENT_2.value[0]: BaiduSdkErrorEnum.INVALID_ARGUMENT_2,
BaiduSdkErrorEnum.SDK_IMAGE_SIZE_ERROR.value[0]: BaiduSdkErrorEnum.SDK_IMAGE_SIZE_ERROR,
BaiduSdkErrorEnum.SDK_IMAGE_LENGTH_ERROR.value[0]: BaiduSdkErrorEnum.SDK_IMAGE_LENGTH_ERROR,
BaiduSdkErrorEnum.SDK_READ_IMAGE_FILE_ERROR.value[0]: BaiduSdkErrorEnum.SDK_READ_IMAGE_FILE_ERROR,
BaiduSdkErrorEnum.SDK_CONNECTION_OR_READ_DATA_TIME_OUT.value[0]: BaiduSdkErrorEnum.SDK_CONNECTION_OR_READ_DATA_TIME_OUT,
BaiduSdkErrorEnum.SDK_UNSUPPORTED_IMAGE_FORMAT.value[0]: BaiduSdkErrorEnum.SDK_UNSUPPORTED_IMAGE_FORMAT,
}

@unique
class VehicleEnum(Enum):
CAR = ("car", "car")
TRICYCLE = ("tricycle", "tricycle")
MOTORBIKE = ("motorbike", "motorbike")
CARPLATE = ("carplate", "carplate")
TRUCK = ("truck", "truck")
BUS = ("bus", "bus")


VehicleEnumVALUE={
VehicleEnum.CAR.value[0]: VehicleEnum.CAR,
VehicleEnum.TRICYCLE.value[0]: VehicleEnum.TRICYCLE,
VehicleEnum.MOTORBIKE.value[0]: VehicleEnum.MOTORBIKE,
VehicleEnum.CARPLATE.value[0]: VehicleEnum.CARPLATE,
VehicleEnum.TRUCK.value[0]: VehicleEnum.TRUCK,
VehicleEnum.BUS.value[0]: VehicleEnum.BUS
}

+ 16
- 42
enums/ExceptionEnum.py Datei anzeigen

@@ -5,62 +5,36 @@ from enum import Enum, unique
@unique
class ExceptionType(Enum):

VIDEO_UPDATE_EXCEPTION = ("SP000", "Video upload exception!")
OR_VIDEO_ADDRESS_EXCEPTION = ("SP000", "拉取原视频失败!")

OR_VIDEO_ADDRESS_EXCEPTION = ("SP001", "Original Video Address Error!")
ANALYSE_TIMEOUT_EXCEPTION = ("SP001", "AI分析超时!")

ANALYSE_TIMEOUT_EXCEPTION = ("SP002", "Analysis Timeout Exception!")
PULLSTREAM_TIMEOUT_EXCEPTION = ("SP002", "原视频拉流超时!")

PULLSTREAM_TIMEOUT_EXCEPTION = ("SP003", "Pull Stream Timeout Exception!")
READSTREAM_TIMEOUT_EXCEPTION = ("SP003", "原视频读取视频流超时!")

READSTREAM_TIMEOUT_EXCEPTION = ("SP004", "READ Stream Timeout Exception!")
GET_VIDEO_URL_EXCEPTION = ("SP004", "获取原视频播放地址失败!")

GET_VIDEO_URL_EXCEPTION = ("SP005", "Get Video Url Exception!")
GET_VIDEO_URL_TIMEOUT_EXCEPTION = ("SP005", "获取原视频播放地址超时!")

GET_VIDEO_URL_TIMEOUT_EXCEPTION = ("SP006", "Get Video Url Timeout Exception!")
PULL_STREAM_URL_EXCEPTION = ("SP006", "拉流地址不能为空!")

PULL_STREAM_URL_EXCEPTION = ("SP007", "Pull Stream Address Is Empty!")
PUSH_STREAM_URL_EXCEPTION = ("SP007", "推流地址不能为空!")

PULL_PIPELINE_INIT_EXCEPTION = ("SP008", "Pull Stream PIPELINE Exception!")
PUSH_STREAM_TIME_EXCEPTION = ("SP008", "推流时间或原视频时间太短, 未生成分析结果, 建议延长推流时间或原视频时间!")

PUSH_STREAM_URL_EXCEPTION = ("SP009", "Push Stream Address Is Empty!")
AI_MODEL_MATCH_EXCEPTION = ("SP009", "未匹配到对应的AI模型!")

CV2_IS_NULL_EXCEPTION = ("SP010", "The CV2 Is Empty!")
ILLEGAL_PARAMETER_FORMAT = ("SP010", "非法参数格式!")

OR_WRITE_OBJECT_EXCEPTION = ("SP011", "The Original Video Writing Object Is Empty!")
PUSH_STREAMING_CHANNEL_IS_OCCUPIED = ("SP011", "推流通道被占用, 请稍后再试!")

AI_WRITE_OBJECT_EXCEPTION = ("SP012", "The Ai Video Writing Object Is Empty!")
VIDEO_RESOLUTION_EXCEPTION = ("SP012", "不支持该分辨率类型的视频,请切换分辨率再试!")

VIDEO_ADDRESS_EXCEPTION = ("SP013", "The Video Address Does Not Exist!")
READ_IAMGE_URL_EXCEPTION = ("SP013", "未能解析图片地址!")

AI_VIDEO_ADDRESS_EXCEPTION = ("SP014", "AI Video Address Error!")

OFFLINE_RETRY_TIMEOUT_EXCEPTION = ("SP015", "Offline Retry Timeout Exception!")

AI_MODEL_CONFIG_EXCEPTION = ("SP016", "AI Model Config Exception!")

AI_MODEL_MATCH_EXCEPTION = ("SP017", "The AI Model Is Not Matched!")

VIDEO_MERGE_EXCEPTION = ("SP018", "The Video Merge Exception!")

VIDEO_ANALYSIS_EXCEPTION = ("SP019", "Video Analysis Failed!")

PUSH_STREAM_URL_E_EXCEPTION = ("SP020", "Push Stream URL Exception!")

VIDEO_CONFIG_EXCEPTION = ("SP021", "Video Config Exception!")

ILLEGAL_PARAMETER_FORMAT = ("SP022", "Illegal Parameter Format!")

REQUEST_TYPE_NOT_MATCHED = ("SP023", "Request Type Not Matched!")

MODEL_ANALYSIS_EXCEPTION = ("SP024", "Model Analysis Exception!")

PUSH_STREAMING_CHANNEL_IS_OCCUPIED = ("SP025", "推流通道被占用, 请稍后再试!")

WRITE_STREAM_EXCEPTION = ("SP026", "视频写流异常, 请联系工程师定位处理!")

VIDEO_RESOLUTION_EXCEPTION = ("SP027", "不支持该分辨率类型的视频,请切换分辨率再试!")
DETECTION_TARGET_TYPES_ARE_NOT_SUPPORTED = ("SP014", "不支持该类型的检测目标!")

NO_GPU_RESOURCES = ("SP998", "暂无GPU资源可以使用,请稍后再试!")

SERVICE_INNER_EXCEPTION = ("SP999", "系统内部异常, 请联系工程师定位处理!")
SERVICE_INNER_EXCEPTION = ("SP999", "系统内部异常!")

+ 28
- 3
enums/ModelTypeEnum.py Datei anzeigen

@@ -1,10 +1,9 @@
from enum import Enum, unique


# 异常枚举

@unique
class ModelType(Enum):

WATER_SURFACE_MODEL = ("1", "001", "河道模型", 'river')

FOREST_FARM_MODEL = ("2", "002", "森林模型", 'forest2')
@@ -27,8 +26,34 @@ class ModelType(Enum):

SHIP_MODEL = ("11", "011", "船只模型", 'ship')

BAIDU_MODEL = ("12", "012", "百度AI图片识别模型", None)

def checkCode(code):
for model in ModelType:
if model.value[1] == code:
return True
return False
return False


'''
参数1: 检测目标名称
参数2: 检测目标
参数3: 初始化百度检测客户端
'''


@unique
class BaiduModelTarget(Enum):
VEHICLE_DETECTION = ("车辆检测", 0, lambda client0, client1, url, request_id: client0.vehicleDetectUrl(url, request_id))

HUMAN_DETECTION = ("人体检测与属性识别", 1, lambda client0, client1, url, request_id: client1.bodyAttr(url, request_id))

PEOPLE_COUNTING = ("人流量统计", 2, lambda client0, client1, url, request_id: client1.bodyNum(url, request_id))

BAIDU_MODEL_TARGET_CONFIG = {
BaiduModelTarget.VEHICLE_DETECTION.value[1]: BaiduModelTarget.VEHICLE_DETECTION,
BaiduModelTarget.HUMAN_DETECTION.value[1]: BaiduModelTarget.HUMAN_DETECTION,
BaiduModelTarget.PEOPLE_COUNTING.value[1]: BaiduModelTarget.PEOPLE_COUNTING
}



BIN
enums/__pycache__/BaiduSdkEnum.cpython-310.pyc Datei anzeigen


BIN
enums/__pycache__/ExceptionEnum.cpython-310.pyc Datei anzeigen


BIN
enums/__pycache__/__init__.cpython-310.pyc Datei anzeigen


BIN
exception/__pycache__/CustomerException.cpython-310.pyc Datei anzeigen


BIN
exception/__pycache__/__init__.cpython-310.pyc Datei anzeigen


+ 0
- 0
font/__init__.py Datei anzeigen


+ 0
- 0
test/editimage/__init__.py Datei anzeigen


+ 45
- 0
test/editimage/editImage.py Datei anzeigen

@@ -0,0 +1,45 @@
from io import BytesIO

import cv2
import matplotlib.pyplot as plt
import matplotlib.patches as pat
import numpy as np
import requests
from PIL import ImageDraw, Image

from util.ImageUtils import url2Array

url = "https://www.2008php.com/2015_Website_appreciate/2015-12-06/20151206234254.jpg"

color= (255, 255, 0)
#( 蓝, 绿, 红)
# 红色 (0, 0, 255)
# 洋红色 (255, 0, 255)
# 青色 (255, 255, 0)
# 黑色 (0, 0, 0)
# 蓝色 (255, 0, 0)
# 绿色 (0, 255, 0)
# 黄色 (0, 255, 255) # 不考虑
img = url2Array(url)
cv2.putText(img,"Hello World", (100,100), cv2.FONT_HERSHEY_SIMPLEX, 1.0,color, 1, cv2.LINE_AA)
# rectangle 坐标的参数格式为左上角(x1, y1),右下角(x2, y2), 颜色 , 粗细
cv2.rectangle(img, (100, 110), (400, 310), color, 2)
cv2.imshow('img', img)
cv2.waitKey()

# fig, ax = plt.subplots(1)
# ax.imshow(img)
# # Rectangle 坐标的参数格式为左上角(x, y),width, height。
# rec = pat.Rectangle((386, 144), 1049, 760, linewidth=2, edgecolor='r', facecolor='None')
# ax.add_patch(rec)
# plt.imshow(img)
# plt.show()
# response = requests.get(url)
# image = Image.open(BytesIO(response.content))
# a = ImageDraw.ImageDraw(image)
# # rectangle 坐标的参数格式为左上角(x1, y1),右下角(x2, y2)。
# a.rectangle(((386, 144), (1435, 904)), fill=None, outline='red', width=2)
# image.show()




+ 6
- 26
test/str/test.py Datei anzeigen

@@ -1,29 +1,9 @@
# a=None
# for i in range(12):
# if a is None:
# a = str(i)
# else:
# a = '%s,%s' % (a, str(i))
# print(a)
# a=[1,2,3,4,5,8, 9]
# b=[1,3,2]
# if set(a) >= set(b):
# print("a")
# else:
# print("b")
from enums.ModelTypeEnum import ModelType

if ModelType.WATER_SURFACE_MODEL == ModelType.FOREST_FARM_MODEL:
print("aaaaa")
else:
print("bbbbbbbbbb")

if isinstance(ModelType.WATER_SURFACE_MODEL, ModelType):
print("aaaaa")
else:
print("bbbbbbbbbb")

if type(ModelType.WATER_SURFACE_MODEL)==ModelType.FOREST_FARM_MODEL:
print("aaaaa")
else:
print("bbbbbbbbbb")
aaa={"1":"1","2":"2","3":"3","4": {"1": "4"}}
for i,v in aaa.items():
if i =="4":
v["1"] = "5"

print(aaa)

+ 21
- 2
util/AliyunSdk.py Datei anzeigen

@@ -26,6 +26,25 @@ class AliyunOssSdk():
self.content["aliyun"]["oss"]["bucket"],
connect_timeout=self.content["aliyun"]["oss"]["connect_timeout"])

def sync_upload_file(self, updatePath, fileByte):
self.logger.info("开始上传文件到oss, requestId:{}", self.requestId)
self.get_oss_bucket()
MAX_RETRIES = 3
retry_count = 0
while True:
try:
self.bucket.put_object(updatePath, fileByte)
self.logger.info("上传文件到oss成功! requestId:{}", self.requestId)
break
except Exception as e:
retry_count += 1
time.sleep(1)
self.logger.info("上传文件到oss失败, 重试次数:{}, requestId:{}", retry_count, self.requestId)
if retry_count > MAX_RETRIES:
self.logger.exception("上传文件到oss重试失败:{}, requestId:{}", e, self.requestId)
raise e


async def put_object(self, updatePath, fileByte):
self.bucket.put_object(updatePath, fileByte)

@@ -118,8 +137,8 @@ class ThAliyunVodSdk():
self.logger.error("vod视频上传失败,重试次数:{}, requestId:{}", retry_count, self.requestId)
if retry_count >= MAX_RETRIES:
self.logger.exception("vod视频上传重试失败: {}, requestId:{}", e, self.requestId)
raise ServiceException(ExceptionType.VIDEO_UPDATE_EXCEPTION.value[0],
ExceptionType.VIDEO_UPDATE_EXCEPTION.value[1])
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])


def get_play_url(args):

+ 15
- 19
util/Cv2Utils.py Datei anzeigen

@@ -475,20 +475,23 @@ class Cv2Util():
def build_write(self):
try:
if self.fps is None or self.width is None or self.height is None:
raise ServiceException(ExceptionType.VIDEO_CONFIG_EXCEPTION.value[0],
ExceptionType.VIDEO_CONFIG_EXCEPTION.value[1])
logger.error("fps、 width、 height为空, requestId:{}", self.requestId)
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
if self.orFilePath is not None and self.or_video_file is None:
self.or_video_file = cv2.VideoWriter(self.orFilePath, cv2.VideoWriter_fourcc(*'mp4v'), self.fps,
(int(self.wn), int(self.hn)))
if self.or_video_file is None:
raise ServiceException(ExceptionType.OR_WRITE_OBJECT_EXCEPTION.value[0],
ExceptionType.OR_WRITE_OBJECT_EXCEPTION.value[1])
logger.error("or_video_file为空, requestId:{}", self.requestId)
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
if self.aiFilePath is not None and self.ai_video_file is None:
self.ai_video_file = cv2.VideoWriter(self.aiFilePath, cv2.VideoWriter_fourcc(*'mp4v'), self.fps,
(int(self.wn * 2), int(self.hn)))
if self.ai_video_file is None:
raise ServiceException(ExceptionType.AI_WRITE_OBJECT_EXCEPTION.value[0],
ExceptionType.AI_WRITE_OBJECT_EXCEPTION.value[1])
logger.error("ai_video_file为空, requestId:{}", self.requestId)
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
except ServiceException as s:
logger.exception("构建文件写对象异常: {}, requestId:{}", s, self.requestId)
raise s
@@ -506,27 +509,20 @@ class Cv2Util():
def getP(self):
if self.p is None:
logger.error("获取管道为空, requestId:{}", self.requestId)
raise ServiceException(ExceptionType.PULL_PIPELINE_INIT_EXCEPTION.value[0],
ExceptionType.PULL_PIPELINE_INIT_EXCEPTION.value[1])
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
return self.p

def getCap(self):
if self.cap is None:
logger.error("获取cv2为空, requestId:{}", self.requestId)
raise ServiceException(ExceptionType.CV2_IS_NULL_EXCEPTION.value[0],
ExceptionType.CV2_IS_NULL_EXCEPTION.value[1])
return self.cap

def getOrVideoFile(self):
if self.or_video_file is None:
logger.error("获取原视频写入对象为空, requestId:{}", self.requestId)
raise ServiceException(ExceptionType.OR_WRITE_OBJECT_EXCEPTION.value[0],
ExceptionType.OR_WRITE_OBJECT_EXCEPTION.value[1])
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
return self.or_video_file

def getAiVideoFile(self):
if self.ai_video_file is None:
logger.error("获取AI视频写入对象为空, requestId:{}", self.requestId)
raise ServiceException(ExceptionType.AI_WRITE_OBJECT_EXCEPTION.value[0],
ExceptionType.AI_WRITE_OBJECT_EXCEPTION.value[1])
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
return self.ai_video_file

+ 80
- 44
util/ImageUtils.py Datei anzeigen

@@ -155,37 +155,41 @@ class PictureWaterMark:
dst_channels[i][ul_points[0]: dr_points[0], ul_points[1]: dr_points[1]] = dst_channels[i][
ul_points[0]: dr_points[0],
ul_points[1]: dr_points[1]] * (
255.0 - mask_channels[3] * alpha) / 255
255.0 - mask_channels[
3] * alpha) / 255
dst_channels[i][ul_points[0]: dr_points[0], ul_points[1]: dr_points[1]] += np.array(
mask_channels[i] * (mask_channels[3] * alpha / 255), dtype=np.uint8)
dst_img = cv2.merge(dst_channels)
return dst_img

#差值感知算法

# 差值感知算法
def dHash(image):
#缩放9*8
image=cv2.resize(image,(9,8),interpolation=cv2.INTER_CUBIC)
#转换灰度图
image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 缩放9*8
image = cv2.resize(image, (9, 8), interpolation=cv2.INTER_CUBIC)
# 转换灰度图
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# print(image.shape)
hash=[]
#每行前一个像素大于后一个像素为1,相反为0,生成哈希
hash = []
# 每行前一个像素大于后一个像素为1,相反为0,生成哈希
for i in range(8):
for j in range(8):
if image[i,j]>image[i,j+1]:
if image[i, j] > image[i, j + 1]:
hash.append(1)
else:
hash.append(0)
return hash

#计算汉明距离
def Hamming_distance(hash1,hash2):

# 计算汉明距离
def Hamming_distance(hash1, hash2):
num = 0
for index in range(len(hash1)):
if hash1[index] != hash2[index]:
num += 1
return num


def url2Array(url):
response = requests.get(url)
image = Image.open(BytesIO(response.content))
@@ -193,36 +197,68 @@ def url2Array(url):
img_bgr = cv2.cvtColor(image1, cv2.COLOR_RGB2BGR)
return img_bgr

if __name__ == '__main__':
# img = cv2.imread("../test/a.jpg", -1)
# fontcolor = 'yellow'
#
# water = TextWaterMark()
# text = "hello world"
#
# # fill_img = water.common_water(img, text, position=4, fontface='../font/庞门正道标题体2.0增强版.ttf', fontsize=20, fontcolor='black')
# fill_img = water.fill_water(img, text, 20)
# # 一定要保存为png格式
# cv2.imshow('result', fill_img)
# cv2.waitKey(111111110)
# print('finish')
pic = PictureWaterMark()
image = cv2.imread("a.jpg")
logo = cv2.imread("../image/logo.png", -1)
# print(image, logo)
start = time.time()
frame = pic.common_water(image, logo)
print(time.time() - start)
start1 = time.time()
frame1 = pic.common_water_1(image, logo)
# cv2.imwrite("watermarked.jpg", frame1)
print(time.time() - start1)
# cap = cv2.VideoCapture("../data/111111.mp4")
# logo = cv2.imread("../image/logo.png", -1)
# while True:
# is_opened, frame = cap.read()
# frame = pic.common_water(frame, logo)
# cv2.imshow('frame', frame)
# cv2.waitKey(1) # 等待输入任何按键
# # 关闭
# cap.release()
def url2Content(url):
response = requests.get(url)
return response.content

def url2Image(url):
response = requests.get(url)
image = Image.open(BytesIO(response.content))
image1 = np.array(image)
img_bgr = cv2.cvtColor(image1, cv2.COLOR_RGB2BGR)
img = Image.fromarray(img_bgr)
return img


def url2Byte(url):
response = requests.get(url)
return BytesIO(response.content)

def markRectangle(url, text, textCoordinate, imageLeftUpCoordinate, imageRightDownCoordinate, color):
img = url2Array(url)
#( 蓝, 绿, 红)
# 红色 (0, 0, 255)
# 洋红色 (255, 0, 255)
# 青色 (255, 255, 0)
# 黑色 (0, 0, 0)
# 蓝色 (255, 0, 0)
# 绿色 (0, 255, 0)
# 黄色 (0, 255, 255) # 不考虑
cv2.putText(img, text, textCoordinate, cv2.FONT_HERSHEY_SIMPLEX, 1.0, color, 1, cv2.LINE_AA)
# rectangle 坐标的参数格式为左上角(x1, y1),右下角(x2, y2), 颜色 , 粗细
cv2.rectangle(img, imageLeftUpCoordinate, imageRightDownCoordinate, color, 2)
return img

# if __name__ == '__main__':
# # img = cv2.imread("../test/a.jpg", -1)
# # fontcolor = 'yellow'
# #
# # water = TextWaterMark()
# # text = "hello world"
# #
# # # fill_img = water.common_water(img, text, position=4, fontface='../font/庞门正道标题体2.0增强版.ttf', fontsize=20, fontcolor='black')
# # fill_img = water.fill_water(img, text, 20)
# # # 一定要保存为png格式
# # cv2.imshow('result', fill_img)
# # cv2.waitKey(111111110)
# # print('finish')
# pic = PictureWaterMark()
# image = cv2.imread("a.jpg")
# logo = cv2.imread("../image/logo.png", -1)
# # print(image, logo)
# start = time.time()
# frame = pic.common_water(image, logo)
# print(time.time() - start)
# start1 = time.time()
# frame1 = pic.common_water_1(image, logo)
# # cv2.imwrite("watermarked.jpg", frame1)
# print(time.time() - start1)
# # cap = cv2.VideoCapture("../data/111111.mp4")
# # logo = cv2.imread("../image/logo.png", -1)
# # while True:
# # is_opened, frame = cap.read()
# # frame = pic.common_water(frame, logo)
# # cv2.imshow('frame', frame)
# # cv2.waitKey(1) # 等待输入任何按键
# # # 关闭
# # cap.release()

+ 240
- 0
util/ImgBaiduSdk.py Datei anzeigen

@@ -0,0 +1,240 @@
import base64
import time
from threading import Lock

import yaml
from aip import AipImageClassify, AipBodyAnalysis
from loguru import logger

from enums.BaiduSdkEnum import BAIDUERRORDATA
from enums.ExceptionEnum import ExceptionType
from exception.CustomerException import ServiceException
from util.ImageUtils import url2Byte, url2Content


class AipImageClassifyClient:

def __init__(self, content):
self.__content = content
self.__client = None
self.init_client()
# self.lock = Lock()

def init_client(self):
if self.__client is None:
self.__client = AipImageClassify(str(self.__content["baidu"]["vehicle"]["APP_ID"]),
self.__content["baidu"]["vehicle"]["API_KEY"],
self.__content["baidu"]["vehicle"]["SECRET_KEY"])

'''
车辆检测
'''

def vehicleDetectUrl(self, url, request_id, options={}):
self.init_client()
# try:
# self.lock.acquire()
reply_num = 0
reply_value = None
while True:
try:
options["show"] = "true"
res_image = self.__client.vehicleDetectUrl(url, options)
error_code = res_image.get("error_code")
if error_code:
enum = BAIDUERRORDATA.get(error_code)
# 如果异常编码未知, 返回空值
if enum is None:
logger.error("百度云车辆检测异常!error_code:{}, request_id: {}", error_code, request_id)
return None
# 重试指定次数后,还是异常,输出统一内部异常
if enum.value[3] == 0:
if reply_value is None:
reply_value = enum.value[4]
logger.error("百度云车辆检测异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}",
enum.value[0], enum.value[2], reply_num, request_id)
raise Exception()
# 重试指定次数后,还是异常,输出对应的异常
if enum.value[3] == 1:
if reply_value is None:
reply_value = enum.value[4]
raise ServiceException(str(enum.value[0]), enum.value[2])
# 重试指定次数后,还是异常,输出空
if enum.value[3] == 2:
if reply_value is None:
reply_value = enum.value[4]
if reply_num >= reply_value:
return None
return res_image
except Exception as e:
logger.exception("车辆检测失败: {}, 当前重试次数:{}, request_id: {}", e, reply_num, request_id)
time.sleep(1)
reply_num += 1
self.init_client()
if reply_num > reply_value:
if isinstance(e, ServiceException):
raise ServiceException(e.code, e.msg)
logger.exception("车辆检测识别失败: {}, request_id: {}", e, request_id)
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
# except Exception as ee:
# logger.exception("车辆检测加锁异常: {}, request_id: {}", ee, request_id)
# raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0],
# ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1])
# finally:
# self.lock.release()


class AipBodyAnalysisClient:

def __init__(self, content):
self.__content = content
self.__client = None
self.init_client()
# self.lock = Lock()

def init_client(self):
if self.__client is None:
self.__client = AipBodyAnalysis(str(self.__content["baidu"]["person"]["APP_ID"]),
self.__content["baidu"]["person"]["API_KEY"],
self.__content["baidu"]["person"]["SECRET_KEY"])

'''
人体检测与属性识别
'''

def bodyAttr(self, url, request_id, options={}):
self.init_client()
image = self.readImage(url, request_id)
# try:
# self.lock.acquire()
reply_num = 0
reply_value = None
while True:
try:
options["show"] = "true"
res_image = self.__client.bodyAttr(image, options)
error_code = res_image.get("error_code")
if error_code:
enum = BAIDUERRORDATA.get(error_code)
# 如果异常编码未知, 返回空值
if enum is None:
logger.error("百度云人体检测与属性识别异常!error_code:{}, request_id: {}", error_code, request_id)
return None
# 重试指定次数后,还是异常,输出统一内部异常
if enum.value[3] == 0:
if reply_value is None:
reply_value = enum.value[4]
logger.error("百度云人体检测与属性识别异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}",
enum.value[0], enum.value[2], reply_num, request_id)
raise Exception()
# 重试指定次数后,还是异常,输出对应的异常
if enum.value[3] == 1:
if reply_value is None:
reply_value = enum.value[4]
raise ServiceException(str(enum.value[0]), enum.value[2])
# 重试指定次数后,还是异常,输出空
if enum.value[3] == 2:
if reply_value is None:
reply_value = enum.value[4]
if reply_num >= reply_value:
return None
return res_image
except Exception as e:
logger.exception("人体检测与属性识别失败: {}, 当前重试次数:{}, request_id: {}", e, reply_num, request_id)
time.sleep(0.5)
reply_num += 1
self.init_client()
if reply_num > reply_value:
if isinstance(e, ServiceException):
raise ServiceException(e.code, e.msg)
logger.exception("人体检测与属性识别失败: {}, request_id: {}", e, request_id)
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
# except Exception as ee:
# logger.exception("车辆检测加锁异常: {}, request_id: {}", ee, request_id)
# raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0],
# ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1])
# finally:
# self.lock.release()

'''
人流量统计
'''

def bodyNum(self, url, request_id, options={}):
self.init_client()
image = self.readImage(url, request_id)
# try:
# self.lock.acquire()
reply_num = 0
reply_value = None
while True:
try:
options["show"] = "true"
res_image = self.__client.bodyNum(image, options)
error_code = res_image.get("error_code")
if error_code:
enum = BAIDUERRORDATA.get(error_code)
# 如果异常编码未知, 返回空值
if enum is None:
logger.error("百度云人流量统计异常!error_code:{}, request_id: {}", error_code, request_id)
return None
# 重试指定次数后,还是异常,输出统一内部异常
if enum.value[3] == 0:
if reply_value is None:
reply_value = enum.value[4]
logger.error("百度云人流量统计异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}",
enum.value[0], enum.value[2], reply_num, request_id)
raise Exception()
# 重试指定次数后,还是异常,输出对应的异常
if enum.value[3] == 1:
if reply_value is None:
reply_value = enum.value[4]
raise ServiceException(str(enum.value[0]), enum.value[2])
# 重试指定次数后,还是异常,输出空
if enum.value[3] == 2:
if reply_value is None:
reply_value = enum.value[4]
if reply_num >= reply_value:
return None
return res_image
except ServiceException as e:
raise ServiceException(e.code, e.msg)
except Exception as e:
logger.exception("人流量统计失败: {}, 当前重试次数:{}, request_id: {}", e, reply_num, request_id)
time.sleep(0.5)
reply_num += 1
self.init_client()
if reply_num > reply_value:
if isinstance(e, ServiceException):
raise ServiceException(e.code, e.msg)
logger.exception("人流量统计失败: {}, request_id: {}", e, request_id)
raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0],
ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1])
# except Exception as ee:
# logger.exception("车辆检测加锁异常: {}, request_id: {}", ee, request_id)
# raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0],
# ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1])
# finally:
# self.lock.release()

def readImage(self, url, request_id):
try:
return url2Content(url)
except Exception as e:
logger.exception("读取图片异常!url: {}, request_id: {}", url, request_id, e)
raise ServiceException(ExceptionType.READ_IAMGE_URL_EXCEPTION.value[0],
ExceptionType.READ_IAMGE_URL_EXCEPTION.value[1])

# if __name__ == '__main__':
# with open(r"D:\work\alg_new\tuoheng_alg\dsp_application.yml", "r", encoding='utf-8') as f:
# file_content = f.read()
# content = yaml.load(file_content, yaml.FullLoader)
# aipImageClassifyClient = AipImageClassifyClient(content)
# aipBodyAnalysisClient = AipBodyAnalysisClient(content)
# url = "https://pic.52112.com/180623/JPG-180623-12/c4cyivkxEh_small.jpg"
# # result = aipImageClassifyClient.vehicleDetectUrl(url, "1111111")
# result = aipBodyAnalysisClient.bodyNum(url, "1111111")
# iamge = base64.b64decode(result.get("image"))
# print(iamge)

+ 95
- 21
util/ModelUtils.py Datei anzeigen

@@ -1,28 +1,33 @@
# -*- coding: utf-8 -*-
import base64
import sys

from enums.ModelTypeEnum import ModelType
from enums.ExceptionEnum import ExceptionType
from enums.ModelTypeEnum import ModelType, BAIDU_MODEL_TARGET_CONFIG, BaiduModelTarget
from exception.CustomerException import ServiceException
from util.GPUtils import get_all_gpu_ids
from util.ImgBaiduSdk import AipBodyAnalysisClient, AipImageClassifyClient

sys.path.extend(['..', '../AIlib2'])
from AI import AI_process,AI_process_forest,get_postProcess_para
import cv2,os,time
from AI import AI_process, AI_process_forest, get_postProcess_para
import cv2, os, time
from segutils.segmodel import SegModel
from models.experimental import attempt_load
from utils.torch_utils import select_device
from utilsK.queRiver import get_labelnames,get_label_arrays,save_problem_images
from utilsK.queRiver import get_labelnames, get_label_arrays, save_problem_images
import numpy as np
import torch,glob
import torch, glob
import tensorrt as trt
from utilsK.masterUtils import get_needed_objectsIndex
from utilsK.jkmUtils import pre_process,post_process,get_return_data
from utilsK.jkmUtils import pre_process, post_process, get_return_data


# 统一模型入口
class Model:
def __init__(self, device, allowedList=None, logger=None, requestId=None, modeType=None):
def __init__(self, device, allowedList=None, logger=None, requestId=None, modeType=None, content=None):
try:
logger.info("########################加载{}########################, requestId:{}", modeType.value[2], requestId)
logger.info("########################加载{}########################, requestId:{}", modeType.value[2],
requestId)
self.modeType = modeType
self.allowedList = allowedList
self.trtFlag_det = True, # 检测模型是否采用TRT
@@ -56,7 +61,7 @@ class Model:
'segPar': {
'modelSize': (640, 360),
'mean': (0.485, 0.456, 0.406),
'std' : (0.229, 0.224, 0.225),
'std': (0.229, 0.224, 0.225),
'numpy': False,
'RGB_convert_first': True
}, # 分割模型预处理参数
@@ -80,8 +85,8 @@ class Model:
Detweights = par.get('Detweights') # 升级后的检测模型
if self.trtFlag_det:
with open(Detweights, "rb") as f, trt.Runtime(trt.Logger(trt.Logger.ERROR)) as runtime:
self.model = runtime.deserialize_cuda_engine(f.read())# 输入trt本地文件,返回ICudaEngine对象
print('####load TRT model :%s'%(Detweights))
self.model = runtime.deserialize_cuda_engine(f.read()) # 输入trt本地文件,返回ICudaEngine对象
print('####load TRT model :%s' % (Detweights))
else:
self.model = attempt_load(Detweights, map_location=self.device) # load FP32 model
if self.half:
@@ -118,7 +123,6 @@ class Model:
logger.exception("异常:{}, requestId:{}", ee, requestId)
raise ee


def process(self, frame, width=1920):
if self.label_arraylist is None:
fontsize = int(width / 1920 * 40)
@@ -145,6 +149,7 @@ class Model:
self.rainbows, self.half, self.device, self.conf_thres, self.iou_thres,
self.allowedList, font=self.digitFont, trtFlag_det=self.trtFlag_det)


# # 河道模型
# class SZModel:
# def __init__(self, device, allowedList=None, logger=None, requestId=None):
@@ -685,20 +690,21 @@ class Model:
# 车牌分割模型、健康码、行程码分割模型
class IMModel:

def __init__(self, device, allowedList=None, logger=None, requestId=None, modeType=None):
def __init__(self, device, allowedList=None, logger=None, requestId=None, modeType=None, content=None):
logger.info("########################加载{}########################, requestId:{}", modeType.value[2], requestId)
self.allowedList = allowedList
if ModelType.EPIDEMIC_PREVENTION_MODEL == modeType:
self.img_type = 'code' ## code,plate
if ModelType.PLATE_MODEL == modeType:
self.img_type = 'plate' ## code,plate
self.par = {'code': {'weights': '../AIlib2/weights/conf/jkm/health_yolov5s_v3.jit', 'img_type': 'code', 'nc': 10},
'plate': {'weights': '../AIlib2/weights/conf/jkm/plate_yolov5s_v3.jit', 'img_type': 'plate', 'nc': 1},
'conf_thres': 0.4,
'iou_thres': 0.45,
'device': 'cuda:%s' % device,
'plate_dilate': (0.5, 0.3)
}
self.par = {
'code': {'weights': '../AIlib2/weights/conf/jkm/health_yolov5s_v3.jit', 'img_type': 'code', 'nc': 10},
'plate': {'weights': '../AIlib2/weights/conf/jkm/plate_yolov5s_v3.jit', 'img_type': 'plate', 'nc': 1},
'conf_thres': 0.4,
'iou_thres': 0.45,
'device': 'cuda:%s' % device,
'plate_dilate': (0.5, 0.3)
}
self.device = torch.device(self.par['device'])
self.model = torch.jit.load(self.par[self.img_type]['weights'])

@@ -708,4 +714,72 @@ class IMModel:
boxes = post_process(pred, padInfos, self.device, conf_thres=self.par['conf_thres'],
iou_thres=self.par['iou_thres'], nc=self.par[self.img_type]['nc']) # 后处理
dataBack = get_return_data(frame, boxes, modelType=self.img_type, plate_dilate=self.par['plate_dilate'])
return dataBack
return dataBack


# 百度AI图片识别模型
class BaiduAiImageModel:

def __init__(self, device=None, allowedList=None, logger=None, requestId=None, modeType=None, content=None):
logger.info("########################加载{}########################, requestId:{}", modeType.value[2], requestId)
self.allowedList = allowedList
self.__requestId = requestId
self.__logger = logger
self.__aipBodyAnalysisClient = AipBodyAnalysisClient(content)
self.__aipImageClassifyClient = AipImageClassifyClient(content)

def process(self, target, url):
baiduEnum = BAIDU_MODEL_TARGET_CONFIG.get(target)
if baiduEnum is None:
raise ServiceException(ExceptionType.DETECTION_TARGET_TYPES_ARE_NOT_SUPPORTED.value[0],
ExceptionType.DETECTION_TARGET_TYPES_ARE_NOT_SUPPORTED.value[1]
+ " target: " + target)
return baiduEnum.value[2](self.__aipImageClassifyClient, self.__aipBodyAnalysisClient, url, self.__requestId)


MODEL_CONFIG = {
# 加载河道模型
ModelType.WATER_SURFACE_MODEL.value[1]: (
lambda x, y, z, r: Model(x, y, z, r, ModelType.WATER_SURFACE_MODEL),
ModelType.WATER_SURFACE_MODEL.value[1]),
# 加载林场模型
ModelType.FOREST_FARM_MODEL.value[1]: (
lambda x, y, z, r: Model(x, y, z, r, ModelType.FOREST_FARM_MODEL),
ModelType.FOREST_FARM_MODEL.value[1]),
# 加载交通模型
ModelType.TRAFFIC_FARM_MODEL.value[1]: (
lambda x, y, z, r: Model(x, y, z, r, ModelType.TRAFFIC_FARM_MODEL),
ModelType.TRAFFIC_FARM_MODEL.value[1]),
# 加载防疫模型
ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]: (
lambda x, y, z, r: IMModel(x, y, z, r, ModelType.EPIDEMIC_PREVENTION_MODEL),
ModelType.EPIDEMIC_PREVENTION_MODEL.value[1]),
# 加载车牌模型
ModelType.PLATE_MODEL.value[1]: (
lambda x, y, z, r: IMModel(x, y, z, r, ModelType.PLATE_MODEL), ModelType.PLATE_MODEL.value[1]),
# 加载车辆模型
ModelType.VEHICLE_MODEL.value[1]: (
lambda x, y, z, r: Model(x, y, z, r, ModelType.VEHICLE_MODEL), ModelType.VEHICLE_MODEL.value[1]),
# 加载行人模型
ModelType.PEDESTRIAN_MODEL.value[1]: (
lambda x, y, z, r: Model(x, y, z, r, ModelType.PEDESTRIAN_MODEL),
ModelType.PEDESTRIAN_MODEL.value[1]),
# 加载烟火模型
ModelType.SMOGFIRE_MODEL.value[1]: (
lambda x, y, z, r: Model(x, y, z, r, ModelType.SMOGFIRE_MODEL), ModelType.SMOGFIRE_MODEL.value[1]),
# 加载钓鱼游泳模型
ModelType.ANGLERSWIMMER_MODEL.value[1]: (
lambda x, y, z, r: Model(x, y, z, r, ModelType.ANGLERSWIMMER_MODEL),
ModelType.ANGLERSWIMMER_MODEL.value[1]),
# 加载乡村模型
ModelType.COUNTRYROAD_MODEL.value[1]: (
lambda x, y, z, r: Model(x, y, z, r, ModelType.COUNTRYROAD_MODEL),
ModelType.COUNTRYROAD_MODEL.value[1]),
# 加载船只模型
ModelType.SHIP_MODEL.value[1]: (
lambda x, y, z, r: Model(x, y, z, r, ModelType.SHIP_MODEL), ModelType.SHIP_MODEL.value[1]),
# 百度AI图片识别模型
ModelType.BAIDU_MODEL.value[1]: (
lambda x, y, z, r, t: BaiduAiImageModel(x, y, z, r, ModelType.BAIDU_MODEL, t),
ModelType.BAIDU_MODEL.value[1])
}

+ 5
- 4
util/OcrBaiduSdk.py Datei anzeigen

@@ -17,8 +17,8 @@ class OcrBaiduSdk:
# self.lock = Lock()

def init_client(self):
self.client = AipOcr(str(self.content["baiduocr"]["APP_ID"]), self.content["baiduocr"]["API_KEY"],
self.content["baiduocr"]["SECRET_KEY"])
self.client = AipOcr(str(self.content["baidu"]["orc"]["APP_ID"]), self.content["baidu"]["orc"]["API_KEY"],
self.content["baidu"]["orc"]["SECRET_KEY"])

'''
{
@@ -31,6 +31,7 @@ class OcrBaiduSdk:
]
}
'''

def universal_text_recognition(self, image, request_id):
# try:
# self.lock.acquire()
@@ -67,6 +68,7 @@ class OcrBaiduSdk:
# ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1])
# finally:
# self.lock.release()

'''
{
"log_id": 3583925545,
@@ -76,6 +78,7 @@ class OcrBaiduSdk:
}
}
'''

def license_plate_recognition(self, image, request_id):
# try:
# self.lock.acquire()
@@ -112,5 +115,3 @@ class OcrBaiduSdk:
# ExceptionType.ABNORMAL_LICENSE_PLATE_RECOGNITION.value[1])
# finally:
# self.lock.release()



BIN
util/__pycache__/ImageUtils.cpython-310.pyc Datei anzeigen


BIN
util/__pycache__/YmlUtils.cpython-310.pyc Datei anzeigen


BIN
util/__pycache__/__init__.cpython-310.pyc Datei anzeigen


Laden…
Abbrechen
Speichern