card_score_calculate.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. from app.utils.scheme import CardDetailResponse, ImageType
  2. from app.core.logger import get_logger
  3. from typing import List
  4. logger = get_logger(__name__)
  5. def card_score_calculate(card_data: dict, images: List) -> CardDetailResponse:
  6. card_data["detection_score"] = None
  7. card_data["modified_score"] = None
  8. card_data["detection_score_detail"] = {}
  9. card_data["modified_score_detail"] = {}
  10. if len(images) == 4:
  11. try:
  12. # ---------- detection_score ----------
  13. detection_score = 10.0
  14. detection_center_score = 10.0
  15. detection_corner_score = 10.0
  16. detection_edge_score = 10.0
  17. detection_face_score = 10.0
  18. for img in images:
  19. try:
  20. # 总分的计算
  21. add_val = img.detection_json.get("result", {}).get("_used_compute_deduct_score", 0)
  22. detection_score += float(add_val or 0)
  23. # 累加不同类型的扣分项
  24. if img.image_type == ImageType.front_edge:
  25. center_reduct_val = img.detection_json.get("result", {}).get("center_result", {}).get(
  26. "deduct_score", 0)
  27. corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  28. "front_corner_deduct_score", 0)
  29. edge_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  30. "front_edge_deduct_score", 0)
  31. detection_center_score += float(center_reduct_val or 0)
  32. detection_corner_score += float(corner_reduct_val or 0)
  33. detection_edge_score += float(edge_reduct_val or 0)
  34. elif img.image_type == ImageType.back_edge:
  35. center_reduct_val = img.detection_json.get("result", {}).get("center_result", {}).get(
  36. "deduct_score", 0
  37. )
  38. corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  39. "back_corner_deduct_score", 0)
  40. edge_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  41. "back_edge_deduct_score", 0)
  42. detection_center_score += float(center_reduct_val or 0)
  43. detection_corner_score += float(corner_reduct_val or 0)
  44. detection_edge_score += float(edge_reduct_val or 0)
  45. elif img.image_type == ImageType.front_face:
  46. face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  47. "front_face_deduct_score", 0)
  48. detection_face_score += float(face_reduct_val or 0)
  49. elif img.image_type == ImageType.back_face:
  50. face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  51. "back_face_deduct_score", 0)
  52. detection_face_score += float(face_reduct_val or 0)
  53. except Exception as e:
  54. logger.warning(f"解析 detection_json 分数失败 (image_id={img.id}): {e}")
  55. card_data["detection_score"] = detection_score
  56. card_data["detection_score_detail"]["detection_center_score"] = detection_center_score
  57. card_data["detection_score_detail"]["detection_corner_score"] = detection_corner_score
  58. card_data["detection_score_detail"]["detection_edge_score"] = detection_edge_score
  59. card_data["detection_score_detail"]["detection_face_score"] = detection_face_score
  60. # ---------- modified_score ----------
  61. modified_score = 10.0
  62. modified_center_score = 10.0
  63. modified_corner_score = 10.0
  64. modified_edge_score = 10.0
  65. modified_face_score = 10.0
  66. all_modified_none = all(img.modified_json is None for img in images)
  67. if not all_modified_none:
  68. for img in images:
  69. src = img.modified_json if img.modified_json is not None else img.detection_json
  70. try:
  71. # 总分的计算
  72. add_val = src.get("result", {}).get("_used_compute_deduct_score", 0)
  73. modified_score += float(add_val or 0)
  74. # 累加不同修改后数据类型的扣分项
  75. if img.image_type == ImageType.front_edge:
  76. center_reduct_val = src.get("result", {}).get("center_result", {}).get(
  77. "deduct_score", 0)
  78. corner_reduct_val = src.get("result", {}).get("defect_result", {}).get(
  79. "front_corner_deduct_score", 0)
  80. edge_reduct_val = src.get("result", {}).get("defect_result", {}).get(
  81. "front_edge_deduct_score", 0)
  82. modified_center_score += float(center_reduct_val or 0)
  83. modified_corner_score += float(corner_reduct_val or 0)
  84. modified_edge_score += float(edge_reduct_val or 0)
  85. elif img.image_type == ImageType.back_edge:
  86. center_reduct_val = src.get("result", {}).get("center_result", {}).get(
  87. "deduct_score", 0
  88. )
  89. corner_reduct_val = src.get("result", {}).get("defect_result", {}).get(
  90. "back_corner_deduct_score", 0)
  91. edge_reduct_val = src.get("result", {}).get("defect_result", {}).get(
  92. "back_edge_deduct_score", 0)
  93. modified_center_score += float(center_reduct_val or 0)
  94. modified_corner_score += float(corner_reduct_val or 0)
  95. modified_edge_score += float(edge_reduct_val or 0)
  96. elif img.image_type == ImageType.front_face:
  97. face_reduct_val = src.get("result", {}).get("defect_result", {}).get(
  98. "front_face_deduct_score", 0)
  99. modified_face_score += float(face_reduct_val or 0)
  100. elif img.image_type == ImageType.back_face:
  101. face_reduct_val = src.get("result", {}).get("defect_result", {}).get(
  102. "back_face_deduct_score", 0)
  103. modified_face_score += float(face_reduct_val or 0)
  104. except Exception as e:
  105. logger.warning(f"解析 modified_json 分数失败 (image_id={img.id}): {e}")
  106. card_data["modified_score"] = modified_score
  107. card_data["modified_score_detail"]["modified_center_score"] = modified_center_score
  108. card_data["modified_score_detail"]["modified_corner_score"] = modified_corner_score
  109. card_data["modified_score_detail"]["modified_edge_score"] = modified_edge_score
  110. card_data["modified_score_detail"]["modified_face_score"] = modified_face_score
  111. else:
  112. card_data["modified_score"] = None
  113. card_data["modified_score_detail"]["modified_center_score"] = None
  114. card_data["modified_score_detail"]["modified_corner_score"] = None
  115. card_data["modified_score_detail"]["modified_edge_score"] = None
  116. card_data["modified_score_detail"]["modified_face_score"] = None
  117. except Exception as e:
  118. logger.error(f"计算分数过程异常: {e}")
  119. # 组合成最终响应
  120. card_response = CardDetailResponse.model_validate(card_data)
  121. card_response.images = images
  122. return card_response