ocr.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from dataclasses import dataclass
  2. from typing import Any
  3. from core.line_parser import LineParser
  4. from core.parser import *
  5. from core.direction import *
  6. import numpy as np
  7. from paddleocr import PaddleOCR
  8. @dataclass
  9. class IdCardOcr:
  10. ocr: PaddleOCR
  11. angle_detector: AngleDetector
  12. # 检测
  13. def predict(self, image: np.ndarray, image_type):
  14. image_type = int(image_type)
  15. image, angle, result = self._pre_process(image, image_type)
  16. print(f'---------- detect angle: {angle} --------')
  17. if image_type == 0:
  18. if angle != 0:
  19. # 角度不为0需要重新识别,字面
  20. _, _, result = self._ocr(image)
  21. else:
  22. _, _, result = self._ocr(image)
  23. return self._post_process(result, angle, image_type)
  24. def _pre_process(self, image, image_type) -> (np.ndarray, int, Any):
  25. angle, result = self.angle_detector.detect_angle(image, image_type)
  26. # angle = detect_angle(image)
  27. if angle == 1:
  28. image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)
  29. print(angle) # 逆时针
  30. if angle == 2:
  31. image = cv2.rotate(image, cv2.ROTATE_180)
  32. if angle == 3:
  33. image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
  34. return image, angle, result
  35. def _ocr(self, image):
  36. # 获取模型检测结果
  37. result = self.ocr.ocr(image, cls=True)
  38. print("------------------")
  39. print(result)
  40. if not result:
  41. raise Exception('无法识别')
  42. confs = [line[1][1] for line in result]
  43. # 将检测到的文字放到一个列表中
  44. txts = [line[1][0] for line in result]
  45. # print("......................................")
  46. # print(txts)
  47. # print("......................................")
  48. return txts, confs, result
  49. def _post_process(self, result, angle: int, image_type):
  50. line_parser = LineParser(result)
  51. line_result = line_parser.parse()
  52. print('-------------')
  53. print(line_result)
  54. print('-------------')
  55. conf = line_parser.confidence
  56. if int(image_type) == 0:
  57. parser = FrontParser(line_result)
  58. elif int(image_type) == 1:
  59. parser = BackParser(line_result)
  60. else:
  61. raise Exception('无法识别')
  62. ocr_res = parser.parse()
  63. res = {
  64. "confidence": conf,
  65. "card_type": str(image_type),
  66. "orientation": angle, # 原angle是逆时针,转成顺时针
  67. **ocr_res
  68. }
  69. print(res)
  70. return res