score_service.py 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from app.core.config import settings
  2. from app.core.logger import logger
  3. from app.services.defect_service import DefectInferenceService
  4. from app.utils.score_inference.CardScorer import CardScorer
  5. from app.utils.json_data_formate import formate_one_card_result
  6. import json
  7. class ScoreService:
  8. def __init__(self):
  9. self.scoring_config_path = settings.SCORE_CONFIG_PATH
  10. def score_inference(self, score_type: str, is_reflect_card: bool,
  11. image_bytes: bytes) -> dict:
  12. defect_service = DefectInferenceService()
  13. card_scorer = CardScorer(config_path=self.scoring_config_path)
  14. logger.info("开始进行卡片分数推理")
  15. center_data = defect_service.defect_inference("pokemon_card_center", image_bytes)
  16. if is_reflect_card:
  17. if score_type == 'front_corner_edge':
  18. defect_data = defect_service.defect_inference('pokemon_front_corner_reflect_defect', image_bytes)
  19. elif score_type == 'front_face':
  20. return {"result": "目前缺少该模型"}
  21. elif score_type == 'back_corner_edge':
  22. defect_data = defect_service.defect_inference('pokemon_back_corner_defect', image_bytes)
  23. elif score_type == 'back_face':
  24. return {"result": "目前缺少该模型"}
  25. else:
  26. return {}
  27. else:
  28. if score_type == 'front_corner_edge':
  29. defect_data = defect_service.defect_inference('pokemon_front_corner_no_reflect_defect', image_bytes)
  30. elif score_type == 'front_face':
  31. defect_data = defect_service.defect_inference('pokemon_front_face_no_reflect_defect', image_bytes)
  32. elif score_type == 'back_corner_edge':
  33. defect_data = defect_service.defect_inference('pokemon_back_corner_defect', image_bytes)
  34. elif score_type == 'back_face':
  35. return {"result": "目前缺少该模型"}
  36. else:
  37. return {}
  38. logger.info("模型推理结束, 开始计算分数")
  39. if score_type == 'front_corner_edge' or score_type == 'front_face':
  40. center_score_data = card_scorer.calculate_centering_score('front', center_data, True)
  41. else:
  42. center_score_data = card_scorer.calculate_centering_score('back', center_data, True)
  43. if score_type == 'front_corner_edge':
  44. # 先计算角的分数, 会把分数写入json, 然后传入刚写好的, 继续写边的分数
  45. corner_score_data = card_scorer.calculate_defect_score('corner', 'front', defect_data, True)
  46. defect_score_data = card_scorer.calculate_defect_score('edge', 'front', corner_score_data, True)
  47. elif score_type == 'front_face':
  48. defect_score_data = card_scorer.calculate_defect_score('face', 'front', defect_data, True)
  49. elif score_type == 'back_corner_edge':
  50. corner_score_data = card_scorer.calculate_defect_score('corner', 'back', defect_data, True)
  51. defect_score_data = card_scorer.calculate_defect_score('edge', 'back', corner_score_data, True)
  52. elif score_type == 'back_face':
  53. defect_score_data = card_scorer.calculate_defect_score('face', 'back', defect_data, True)
  54. result_json = formate_one_card_result(center_score_data, defect_score_data)
  55. temp_score_json_path = settings.TEMP_WORK_DIR / f'{score_type}_score.json'
  56. with open(temp_score_json_path, 'w', encoding='utf-8') as f:
  57. json.dump(result_json, f, ensure_ascii=False, indent=2)
  58. logger.info("分数推理完成 ")
  59. return result_json