148 lines
6.3 KiB
Python
148 lines
6.3 KiB
Python
|
|
import time
|
|||
|
|
import traceback
|
|||
|
|
from os.path import join
|
|||
|
|
|
|||
|
|
import cv2
|
|||
|
|
from aip import AipOcr
|
|||
|
|
from loguru import logger
|
|||
|
|
|
|||
|
|
from common.YmlConstant import baidu_yml_path
|
|||
|
|
from enums.BaiduSdkEnum import BAIDUERRORDATA
|
|||
|
|
from enums.ExceptionEnum import ExceptionType
|
|||
|
|
from exception.CustomerException import ServiceException
|
|||
|
|
from util.RWUtils import getConfigs
|
|||
|
|
|
|||
|
|
|
|||
|
|
class OcrBaiduSdk:
|
|||
|
|
|
|||
|
|
__slots__ = ('client', "__config")
|
|||
|
|
|
|||
|
|
def __init__(self, base_dir, env):
|
|||
|
|
self.client = None
|
|||
|
|
self.__config = getConfigs(join(base_dir, baidu_yml_path % env))
|
|||
|
|
self.init_client()
|
|||
|
|
|
|||
|
|
def init_client(self):
|
|||
|
|
if self.client is None:
|
|||
|
|
self.client = AipOcr(str(self.__config["orc"]["APP_ID"]),
|
|||
|
|
self.__config["orc"]["API_KEY"],
|
|||
|
|
self.__config["orc"]["SECRET_KEY"])
|
|||
|
|
|
|||
|
|
'''
|
|||
|
|
{
|
|||
|
|
"log_id": 2471272194,
|
|||
|
|
"words_result_num": 2,
|
|||
|
|
"words_result":
|
|||
|
|
[
|
|||
|
|
{"words": " TSINGTAO"},
|
|||
|
|
{"words": "青島睥酒"}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
'''
|
|||
|
|
|
|||
|
|
def universal_text_recognition(self, image, request_id):
|
|||
|
|
reply_num = 0
|
|||
|
|
reply_value = None
|
|||
|
|
while True:
|
|||
|
|
try:
|
|||
|
|
or_result, or_image = cv2.imencode(".jpg", image)
|
|||
|
|
options = {
|
|||
|
|
"language_type": "CHN_ENG",
|
|||
|
|
"detect_direction": "true",
|
|||
|
|
"detect_language": "true",
|
|||
|
|
"probability": "true"
|
|||
|
|
}
|
|||
|
|
res_image = self.client.basicGeneral(or_image.tobytes(), 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
|
|||
|
|
raise Exception()
|
|||
|
|
return res_image
|
|||
|
|
except Exception as e:
|
|||
|
|
time.sleep(1)
|
|||
|
|
reply_num += 0.5
|
|||
|
|
self.init_client()
|
|||
|
|
if reply_num > reply_value:
|
|||
|
|
if isinstance(e, ServiceException):
|
|||
|
|
raise ServiceException(e.code, e.msg)
|
|||
|
|
logger.error("通用文字识别失败: {}, request_id: {}", traceback.format_exc(), request_id)
|
|||
|
|
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
|
|||
|
|
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
|
|||
|
|
|
|||
|
|
'''
|
|||
|
|
{
|
|||
|
|
"log_id": 3583925545,
|
|||
|
|
"words_result": {
|
|||
|
|
"color": "blue",
|
|||
|
|
"number": "苏HS7766"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
'''
|
|||
|
|
def license_plate_recognition(self, image, request_id):
|
|||
|
|
reply_num = 0
|
|||
|
|
reply_value = None
|
|||
|
|
while True:
|
|||
|
|
try:
|
|||
|
|
or_result, or_image = cv2.imencode(".jpg", image)
|
|||
|
|
res_image = self.client.licensePlate(or_image.tobytes(), {"multi_detect": "true"})
|
|||
|
|
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
|
|||
|
|
raise Exception()
|
|||
|
|
return res_image
|
|||
|
|
except Exception as e:
|
|||
|
|
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.error("车牌识别失败: {}, request_id: {}", traceback.format_exc(), request_id)
|
|||
|
|
raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
|
|||
|
|
ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
|
|||
|
|
|