Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

302 lines
14KB

  1. import time
  2. import traceback
  3. from aip import AipImageClassify, AipBodyAnalysis
  4. from loguru import logger
  5. from common.YmlConstant import get_baidu_vehicle_APP_ID, get_baidu_vehicle_API_KEY, get_baidu_vehicle_SECRET_KEY, \
  6. get_baidu_person_APP_ID, get_baidu_person_API_KEY, get_baidu_person_SECRET_KEY
  7. from enums.BaiduSdkEnum import BAIDUERRORDATA
  8. from enums.ExceptionEnum import ExceptionType
  9. from exception.CustomerException import ServiceException
  10. from util.ImageUtils import url2Content
  11. from util.RWUtils import getConfigs
  12. class AipImageClassifyClient:
  13. __slots__ = [
  14. '__client',
  15. '__aliyun_config'
  16. ]
  17. def __init__(self, base_dir):
  18. self.__client = None
  19. self.__aliyun_config = getConfigs(base_dir, 'config/dsp_baidu.json')
  20. self.init_client()
  21. # self.lock = Lock()
  22. def init_client(self):
  23. if self.__client is None:
  24. self.__client = AipImageClassify(str(self.__aliyun_config["vehicle"]["APP_ID"]),
  25. self.__aliyun_config["vehicle"]["API_KEY"],
  26. self.__aliyun_config["vehicle"]["SECRET_KEY"])
  27. '''
  28. 车辆检测
  29. '''
  30. def vehicleDetectUrl(self, url, request_id, options={}):
  31. self.init_client()
  32. # try:
  33. # self.lock.acquire()
  34. reply_num = 0
  35. reply_value = None
  36. while True:
  37. try:
  38. options["show"] = "true"
  39. res_image = self.__client.vehicleDetectUrl(url, options)
  40. error_code = res_image.get("error_code")
  41. if error_code:
  42. enum = BAIDUERRORDATA.get(error_code)
  43. # 如果异常编码未知, 返回空值
  44. if enum is None:
  45. logger.error("百度云车辆检测异常!error_code:{}, request_id: {}", error_code, request_id)
  46. return None
  47. # 重试指定次数后,还是异常,输出统一内部异常
  48. if enum.value[3] == 0:
  49. if reply_value is None:
  50. reply_value = enum.value[4]
  51. logger.error("百度云车辆检测异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}",
  52. enum.value[0], enum.value[2], reply_num, request_id)
  53. raise Exception()
  54. # 重试指定次数后,还是异常,输出对应的异常
  55. if enum.value[3] == 1:
  56. if reply_value is None:
  57. reply_value = enum.value[4]
  58. raise ServiceException(str(enum.value[0]), enum.value[2])
  59. # 重试指定次数后,还是异常,输出空
  60. if enum.value[3] == 2:
  61. if reply_value is None:
  62. reply_value = enum.value[4]
  63. if reply_num >= reply_value:
  64. return None
  65. raise Exception()
  66. return res_image
  67. except Exception as e:
  68. time.sleep(1)
  69. reply_num += 1
  70. self.init_client()
  71. if reply_num > reply_value:
  72. if isinstance(e, ServiceException):
  73. raise ServiceException(e.code, e.msg)
  74. logger.error("车辆检测识别失败: {}, request_id: {}", traceback.format_exc(), request_id)
  75. raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
  76. ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
  77. # except Exception as ee:
  78. # logger.exception("车辆检测加锁异常: {}, request_id: {}", ee, request_id)
  79. # raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0],
  80. # ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1])
  81. # finally:
  82. # self.lock.release()
  83. '''
  84. 车辆检测
  85. '''
  86. def vehicleDetect(self, iamge, request_id, options={}):
  87. self.init_client()
  88. # try:
  89. # self.lock.acquire()
  90. reply_num = 0
  91. reply_value = None
  92. while True:
  93. try:
  94. options["show"] = "true"
  95. res_image = self.__client.vehicleDetect(iamge, options)
  96. error_code = res_image.get("error_code")
  97. if error_code:
  98. enum = BAIDUERRORDATA.get(error_code)
  99. # 如果异常编码未知, 返回空值
  100. if enum is None:
  101. logger.error("百度云车辆检测异常!error_code:{}, request_id: {}", error_code, request_id)
  102. return None
  103. # 重试指定次数后,还是异常,输出统一内部异常
  104. if enum.value[3] == 0:
  105. if reply_value is None:
  106. reply_value = enum.value[4]
  107. logger.error("百度云车辆检测异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}",
  108. enum.value[0], enum.value[2], reply_num, request_id)
  109. raise Exception()
  110. # 重试指定次数后,还是异常,输出对应的异常
  111. if enum.value[3] == 1:
  112. if reply_value is None:
  113. reply_value = enum.value[4]
  114. raise ServiceException(str(enum.value[0]), enum.value[2])
  115. # 重试指定次数后,还是异常,输出空
  116. if enum.value[3] == 2:
  117. if reply_value is None:
  118. reply_value = enum.value[4]
  119. if reply_num >= reply_value:
  120. return None
  121. raise Exception()
  122. return res_image
  123. except Exception as e:
  124. time.sleep(1)
  125. reply_num += 1
  126. self.init_client()
  127. if reply_num > reply_value:
  128. if isinstance(e, ServiceException):
  129. raise ServiceException(e.code, e.msg)
  130. logger.error("车辆检测识别失败: {}, request_id: {}", traceback.format_exc(), request_id)
  131. raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
  132. ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
  133. class AipBodyAnalysisClient:
  134. __slots__ = [
  135. '__aliyun_config',
  136. '__client'
  137. ]
  138. def __init__(self, base_dir):
  139. self.__client = None
  140. self.__aliyun_config = getConfigs(base_dir, 'config/dsp_baidu.json')
  141. self.init_client()
  142. # self.lock = Lock()
  143. def init_client(self):
  144. if self.__client is None:
  145. self.__client = AipBodyAnalysis(str(self.__aliyun_config["person"]["APP_ID"]),
  146. self.__aliyun_config["person"]["API_KEY"],
  147. self.__aliyun_config["person"]["SECRET_KEY"])
  148. '''
  149. 人体检测与属性识别
  150. '''
  151. def bodyAttr(self, url, request_id, options={}):
  152. self.init_client()
  153. image = self.readImage(url, request_id)
  154. # try:
  155. # self.lock.acquire()
  156. reply_num = 0
  157. reply_value = None
  158. while True:
  159. try:
  160. options["show"] = "true"
  161. res_image = self.__client.bodyAttr(image, options)
  162. error_code = res_image.get("error_code")
  163. if error_code:
  164. enum = BAIDUERRORDATA.get(error_code)
  165. # 如果异常编码未知, 返回空值
  166. if enum is None:
  167. logger.error("百度云人体检测与属性识别异常!error_code:{}, request_id: {}", error_code, request_id)
  168. return None
  169. # 重试指定次数后,还是异常,输出统一内部异常
  170. if enum.value[3] == 0:
  171. if reply_value is None:
  172. reply_value = enum.value[4]
  173. logger.error("百度云人体检测与属性识别异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}",
  174. enum.value[0], enum.value[2], reply_num, request_id)
  175. raise Exception()
  176. # 重试指定次数后,还是异常,输出对应的异常
  177. if enum.value[3] == 1:
  178. if reply_value is None:
  179. reply_value = enum.value[4]
  180. raise ServiceException(str(enum.value[0]), enum.value[2])
  181. # 重试指定次数后,还是异常,输出空
  182. if enum.value[3] == 2:
  183. if reply_value is None:
  184. reply_value = enum.value[4]
  185. if reply_num >= reply_value:
  186. return None
  187. raise Exception()
  188. return res_image
  189. except Exception as e:
  190. time.sleep(0.5)
  191. reply_num += 1
  192. self.init_client()
  193. if reply_num > reply_value:
  194. if isinstance(e, ServiceException):
  195. raise ServiceException(e.code, e.msg)
  196. logger.error("人体检测与属性识别失败: {}, request_id: {}", traceback.format_exc(), request_id)
  197. raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
  198. ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
  199. # except Exception as ee:
  200. # logger.exception("车辆检测加锁异常: {}, request_id: {}", ee, request_id)
  201. # raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0],
  202. # ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1])
  203. # finally:
  204. # self.lock.release()
  205. '''
  206. 人流量统计
  207. '''
  208. def bodyNum(self, url, request_id, options={}):
  209. self.init_client()
  210. image = self.readImage(url, request_id)
  211. # try:
  212. # self.lock.acquire()
  213. reply_num = 0
  214. reply_value = None
  215. while True:
  216. try:
  217. options["show"] = "true"
  218. res_image = self.__client.bodyNum(image, options)
  219. error_code = res_image.get("error_code")
  220. if error_code:
  221. enum = BAIDUERRORDATA.get(error_code)
  222. # 如果异常编码未知, 返回空值
  223. if enum is None:
  224. logger.error("百度云人流量统计异常!error_code:{}, request_id: {}", error_code, request_id)
  225. return None
  226. # 重试指定次数后,还是异常,输出统一内部异常
  227. if enum.value[3] == 0:
  228. if reply_value is None:
  229. reply_value = enum.value[4]
  230. logger.error("百度云人流量统计异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}",
  231. enum.value[0], enum.value[2], reply_num, request_id)
  232. raise Exception()
  233. # 重试指定次数后,还是异常,输出对应的异常
  234. if enum.value[3] == 1:
  235. if reply_value is None:
  236. reply_value = enum.value[4]
  237. raise ServiceException(str(enum.value[0]), enum.value[2])
  238. # 重试指定次数后,还是异常,输出空
  239. if enum.value[3] == 2:
  240. if reply_value is None:
  241. reply_value = enum.value[4]
  242. if reply_num >= reply_value:
  243. return None
  244. raise Exception()
  245. return res_image
  246. except Exception as e:
  247. time.sleep(0.5)
  248. reply_num += 1
  249. self.init_client()
  250. if reply_num > reply_value:
  251. if isinstance(e, ServiceException):
  252. raise ServiceException(e.code, e.msg)
  253. logger.exception("人流量统计失败: {}, request_id: {}", traceback.format_exc(), request_id)
  254. raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
  255. ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
  256. # except Exception as ee:
  257. # logger.exception("车辆检测加锁异常: {}, request_id: {}", ee, request_id)
  258. # raise ServiceException(ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[0],
  259. # ExceptionType.UNIVERSAL_TEXT_RECOGNITION_FAILED.value[1])
  260. # finally:
  261. # self.lock.release()
  262. def readImage(self, url, request_id):
  263. try:
  264. return url2Content(url)
  265. except Exception as e:
  266. logger.error("读取图片异常!url: {}, request_id: {}, 异常信息:{}", url, request_id, traceback.format_exc())
  267. raise ServiceException(ExceptionType.READ_IAMGE_URL_EXCEPTION.value[0],
  268. ExceptionType.READ_IAMGE_URL_EXCEPTION.value[1])
  269. # if __name__ == '__main__':
  270. # with open(r"D:\work\alg_new\tuoheng_alg\dsp_application.json", "r", encoding='utf-8') as f:
  271. # file_content = f.read()
  272. # content = yaml.load(file_content, yaml.FullLoader)
  273. # aipImageClassifyClient = AipImageClassifyClient(content)
  274. # aipBodyAnalysisClient = AipBodyAnalysisClient(content)
  275. # url = "https://pic.52112.com/180623/JPG-180623-12/c4cyivkxEh_small.jpg"
  276. # # result = aipImageClassifyClient.vehicleDetectUrl(url, "1111111")
  277. # result = aipBodyAnalysisClient.bodyNum(url, "1111111")
  278. # iamge = base64.b64decode(result.get("image"))
  279. # print(iamge)