score_service.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import cv2
  2. from app.core.config import settings
  3. from app.core.logger import get_logger
  4. from app.services.defect_service import DefectInferenceService
  5. from app.services.card_rectify_and_center import CardRectifyAndCenter
  6. from app.utils.score_inference.CardScorer import CardScorer
  7. import numpy as np
  8. import json
  9. logger = get_logger(__name__)
  10. class ScoreService:
  11. def __init__(self):
  12. self.scoring_config_path = settings.SCORE_CONFIG_PATH
  13. self.card_scorer = CardScorer(config_path=self.scoring_config_path)
  14. self.defect_service = DefectInferenceService()
  15. self.rectify_center_service = CardRectifyAndCenter()
  16. def score_inference(self, score_type: str, is_reflect_card: bool,
  17. img_bgr: np.ndarray) -> dict:
  18. logger.info("开始进行卡片居中和转正")
  19. img_bgr = self.rectify_center_service.rectify_and_center(img_bgr)
  20. logger.info("开始进行卡片分数推理")
  21. if score_type == 'front_corner_edge' or score_type == 'front_face':
  22. center_data = self.defect_service.defect_inference("pokemon_front_card_center", img_bgr.copy())
  23. else:
  24. center_data = self.defect_service.defect_inference("pokemon_back_card_center", img_bgr.copy())
  25. if is_reflect_card:
  26. if score_type == 'front_corner_edge':
  27. defect_data = self.defect_service.defect_inference('pokemon_front_corner_reflect_defect',
  28. img_bgr.copy())
  29. elif score_type == 'front_face':
  30. defect_data = self.defect_service.defect_inference('pokemon_front_face_reflect_defect', img_bgr.copy())
  31. elif score_type == 'back_corner_edge':
  32. defect_data = self.defect_service.defect_inference('pokemon_back_corner_defect', img_bgr.copy())
  33. elif score_type == 'back_face':
  34. defect_data = self.defect_service.defect_inference('pokemon_back_face_defect', img_bgr.copy())
  35. else:
  36. return {}
  37. else:
  38. if score_type == 'front_corner_edge':
  39. defect_data = self.defect_service.defect_inference('pokemon_front_corner_no_reflect_defect',
  40. img_bgr.copy())
  41. elif score_type == 'front_face':
  42. defect_data = self.defect_service.defect_inference('pokemon_front_face_no_reflect_defect',
  43. img_bgr.copy())
  44. elif score_type == 'back_corner_edge':
  45. defect_data = self.defect_service.defect_inference('pokemon_back_corner_defect', img_bgr.copy())
  46. elif score_type == 'back_face':
  47. defect_data = self.defect_service.defect_inference('pokemon_back_face_defect', img_bgr.copy())
  48. else:
  49. return {}
  50. logger.info("模型推理结束, 开始计算分数")
  51. if score_type == 'front_corner_edge' or score_type == 'front_face':
  52. card_aspect = "front"
  53. else:
  54. card_aspect = "back"
  55. if score_type == 'front_corner_edge' or score_type == 'back_corner_edge':
  56. card_defect_type = "corner_edge"
  57. else:
  58. card_defect_type = "face"
  59. center_score_data = self.card_scorer.calculate_centering_score(card_aspect, center_data, True)
  60. if card_defect_type == 'corner_edge':
  61. # 先计算角的分数, 会把分数写入json, 然后传入刚写好的, 继续写边的分数
  62. corner_score_data = self.card_scorer.calculate_defect_score('corner', card_aspect, defect_data, True)
  63. defect_score_data = self.card_scorer.calculate_defect_score('edge', card_aspect, corner_score_data, True)
  64. elif card_defect_type == 'face':
  65. defect_score_data = self.card_scorer.calculate_defect_score('face', card_aspect, defect_data, True)
  66. else:
  67. return {}
  68. result_json = self.card_scorer.formate_one_card_result(center_score_data, defect_score_data,
  69. card_defect_type=card_defect_type,
  70. card_aspect=card_aspect)
  71. temp_score_json_path = settings.TEMP_WORK_DIR / f'{score_type}_score.json'
  72. with open(temp_score_json_path, 'w', encoding='utf-8') as f:
  73. json.dump(result_json, f, ensure_ascii=False, indent=2)
  74. logger.info("分数推理完成 ")
  75. return result_json
  76. def recalculate_defect_score(self, score_type: str, json_data: dict):
  77. print(score_type)
  78. print(json_data)
  79. center_json_data = json_data["result"]['center_result']
  80. defect_json_data = json_data["result"]['defect_result']
  81. logger.info("开始进行居中信息重计算")
  82. center_data = self.defect_service.re_inference_from_json(inference_type="center",
  83. center_json=center_json_data,
  84. defect_json=defect_json_data)
  85. logger.info("开始进行缺陷信息重计算")
  86. if score_type == 'front_corner_edge' or score_type == 'back_corner_edge':
  87. inference_type = "corner_edge"
  88. else:
  89. inference_type = "face"
  90. defect_data = self.defect_service.re_inference_from_json(inference_type=inference_type,
  91. center_json=center_json_data,
  92. defect_json=defect_json_data)
  93. logger.info("开始重新计算分数")
  94. if score_type == 'front_corner_edge' or score_type == 'front_face':
  95. card_aspect = "front"
  96. else:
  97. card_aspect = "back"
  98. if score_type == 'front_corner_edge' or score_type == 'back_corner_edge':
  99. card_defect_type = "corner_edge"
  100. else:
  101. card_defect_type = "face"
  102. center_score_data = self.card_scorer.calculate_centering_score(card_aspect, center_data, True)
  103. if card_defect_type == 'corner_edge':
  104. # 先计算角的分数, 会把分数写入json, 然后传入刚写好的, 继续写边的分数
  105. corner_score_data = self.card_scorer.calculate_defect_score('corner', card_aspect, defect_data, True)
  106. defect_score_data = self.card_scorer.calculate_defect_score('edge', card_aspect, corner_score_data, True)
  107. elif card_defect_type == 'face':
  108. defect_score_data = self.card_scorer.calculate_defect_score('face', card_aspect, defect_data, True)
  109. else:
  110. return {}
  111. result_json = self.card_scorer.formate_one_card_result(center_score_data, defect_score_data,
  112. card_defect_type=card_defect_type,
  113. card_aspect=card_aspect)
  114. temp_score_json_path = settings.TEMP_WORK_DIR / f're_{score_type}_score.json'
  115. with open(temp_score_json_path, 'w', encoding='utf-8') as f:
  116. json.dump(result_json, f, ensure_ascii=False, indent=2)
  117. logger.info("分数推理完成 ")
  118. return result_json