score_service.py 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. from app.utils.json_data_formate import formate_one_card_result
  8. import numpy as np
  9. import json
  10. logger = get_logger(__name__)
  11. class ScoreService:
  12. def __init__(self):
  13. self.scoring_config_path = settings.SCORE_CONFIG_PATH
  14. def score_inference(self, score_type: str, is_reflect_card: bool,
  15. img_bgr: np.ndarray) -> dict:
  16. defect_service = DefectInferenceService()
  17. rectify_center_service = CardRectifyAndCenter()
  18. card_scorer = CardScorer(config_path=self.scoring_config_path)
  19. logger.info("开始进行卡片居中和转正")
  20. img_bgr = rectify_center_service.rectify_and_center(img_bgr)
  21. logger.info("开始进行卡片分数推理")
  22. if score_type == 'front_corner_edge' or score_type == 'front_face':
  23. center_data = defect_service.defect_inference("pokemon_front_card_center", img_bgr.copy())
  24. else:
  25. center_data = defect_service.defect_inference("pokemon_back_card_center", img_bgr.copy())
  26. if is_reflect_card:
  27. if score_type == 'front_corner_edge':
  28. defect_data = defect_service.defect_inference('pokemon_front_corner_reflect_defect', img_bgr.copy())
  29. elif score_type == 'front_face':
  30. defect_data = defect_service.defect_inference('pokemon_front_face_reflect_defect', img_bgr.copy())
  31. elif score_type == 'back_corner_edge':
  32. defect_data = defect_service.defect_inference('pokemon_back_corner_defect', img_bgr.copy())
  33. elif score_type == 'back_face':
  34. defect_data = 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 = defect_service.defect_inference('pokemon_front_corner_no_reflect_defect', img_bgr.copy())
  40. elif score_type == 'front_face':
  41. defect_data = defect_service.defect_inference('pokemon_front_face_no_reflect_defect', img_bgr.copy())
  42. elif score_type == 'back_corner_edge':
  43. defect_data = defect_service.defect_inference('pokemon_back_corner_defect', img_bgr.copy())
  44. elif score_type == 'back_face':
  45. defect_data = defect_service.defect_inference('pokemon_back_face_defect', img_bgr.copy())
  46. else:
  47. return {}
  48. logger.info("模型推理结束, 开始计算分数")
  49. if score_type == 'front_corner_edge' or score_type == 'front_face':
  50. center_score_data = card_scorer.calculate_centering_score('front', center_data, True)
  51. else:
  52. center_score_data = card_scorer.calculate_centering_score('back', center_data, True)
  53. if score_type == 'front_corner_edge':
  54. # 先计算角的分数, 会把分数写入json, 然后传入刚写好的, 继续写边的分数
  55. corner_score_data = card_scorer.calculate_defect_score('corner', 'front', defect_data, True)
  56. defect_score_data = card_scorer.calculate_defect_score('edge', 'front', corner_score_data, True)
  57. elif score_type == 'front_face':
  58. defect_score_data = card_scorer.calculate_defect_score('face', 'front', defect_data, True)
  59. elif score_type == 'back_corner_edge':
  60. corner_score_data = card_scorer.calculate_defect_score('corner', 'back', defect_data, True)
  61. defect_score_data = card_scorer.calculate_defect_score('edge', 'back', corner_score_data, True)
  62. elif score_type == 'back_face':
  63. defect_score_data = card_scorer.calculate_defect_score('face', 'back', defect_data, True)
  64. else:
  65. return {}
  66. result_json = formate_one_card_result(center_score_data, defect_score_data)
  67. temp_score_json_path = settings.TEMP_WORK_DIR / f'{score_type}_score.json'
  68. with open(temp_score_json_path, 'w', encoding='utf-8') as f:
  69. json.dump(result_json, f, ensure_ascii=False, indent=2)
  70. logger.info("分数推理完成 ")
  71. return result_json