card_score_calculate.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from app.utils.scheme import ImageType, CardImageResponse
  2. from app.core.logger import get_logger
  3. from typing import List, Dict, Any
  4. logger = get_logger(__name__)
  5. def calculate_scores_from_images(images: List[CardImageResponse]) -> Dict[str, Any]:
  6. """
  7. 根据图片计算分数。
  8. 已更新为新的类型名称: front_coaxial, front_ring 等。
  9. """
  10. scores = {
  11. "detection_score": None,
  12. "modified_score": None,
  13. "detection_score_detail": {
  14. "detection_center_score": None,
  15. "detection_corner_score": None,
  16. "detection_edge_score": None,
  17. "detection_face_score": None
  18. },
  19. "modified_score_detail": {
  20. "modified_center_score": None,
  21. "modified_corner_score": None,
  22. "modified_edge_score": None,
  23. "modified_face_score": None
  24. },
  25. "is_edited": False,
  26. }
  27. # 过滤掉灰度图,只计算主4张图
  28. valid_images = [img for img in images if img.image_type in [
  29. ImageType.front_coaxial, ImageType.back_coaxial,
  30. ImageType.front_ring, ImageType.back_ring
  31. ]]
  32. if len(valid_images) != 4:
  33. return scores
  34. try:
  35. # ---------- detection_score ----------
  36. detection_score = 10.0
  37. detection_center_score = 10.0
  38. detection_corner_score = 10.0
  39. detection_edge_score = 10.0
  40. detection_face_score = 10.0
  41. for img in valid_images:
  42. try:
  43. add_val = img.detection_json.get("result", {}).get("_used_compute_deduct_score", 0)
  44. detection_score += float(add_val or 0)
  45. if img.image_type == ImageType.front_ring:
  46. center_reduct_val = img.detection_json.get("result", {}).get("center_result", {}).get(
  47. "deduct_score", 0)
  48. corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  49. "front_corner_deduct_score", 0)
  50. edge_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  51. "front_edge_deduct_score", 0)
  52. face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  53. "front_face_deduct_score", 0)
  54. detection_center_score += float(center_reduct_val or 0)
  55. detection_corner_score += float(corner_reduct_val or 0)
  56. detection_edge_score += float(edge_reduct_val or 0)
  57. detection_face_score += float(face_reduct_val or 0)
  58. elif img.image_type == ImageType.back_ring:
  59. center_reduct_val = img.detection_json.get("result", {}).get("center_result", {}).get(
  60. "deduct_score", 0)
  61. corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  62. "back_corner_deduct_score", 0)
  63. edge_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  64. "back_edge_deduct_score", 0)
  65. face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  66. "back_face_deduct_score", 0)
  67. detection_center_score += float(center_reduct_val or 0)
  68. detection_corner_score += float(corner_reduct_val or 0)
  69. detection_edge_score += float(edge_reduct_val or 0)
  70. detection_face_score += float(face_reduct_val or 0)
  71. elif img.image_type == ImageType.front_coaxial:
  72. face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  73. "front_face_deduct_score", 0)
  74. detection_face_score += float(face_reduct_val or 0)
  75. elif img.image_type == ImageType.back_coaxial: # 原 back_face
  76. face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  77. "back_face_deduct_score", 0)
  78. detection_face_score += float(face_reduct_val or 0)
  79. except Exception as e:
  80. logger.warning(f"解析 detection_json 分数失败 (image_id={img.id}): {e}")
  81. scores["detection_score"] = detection_score
  82. scores["detection_score_detail"] = {
  83. "detection_center_score": detection_center_score,
  84. "detection_corner_score": detection_corner_score,
  85. "detection_edge_score": detection_edge_score,
  86. "detection_face_score": detection_face_score,
  87. }
  88. # ---------- modified_score ----------
  89. modified_score = 10.0
  90. modified_center_score = 10.0
  91. modified_corner_score = 10.0
  92. modified_edge_score = 10.0
  93. modified_face_score = 10.0
  94. is_edited = any(img.modified_json is not None for img in valid_images)
  95. scores["is_edited"] = is_edited
  96. if is_edited:
  97. for img in valid_images:
  98. src = img.modified_json if img.modified_json is not None else img.detection_json
  99. try:
  100. add_val = src.get("result", {}).get("_used_compute_deduct_score", 0)
  101. modified_score += float(add_val or 0)
  102. if img.image_type == ImageType.front_ring:
  103. center_reduct_val = src.get("result", {}).get("center_result", {}).get("deduct_score", 0)
  104. corner_reduct_val = src.get("result", {}).get("defect_result", {}).get(
  105. "front_corner_deduct_score", 0)
  106. edge_reduct_val = src.get("result", {}).get("defect_result", {}).get("front_edge_deduct_score",
  107. 0)
  108. face_reduct_val = src.get("result", {}).get("defect_result", {}).get("front_face_deduct_score",
  109. 0)
  110. modified_center_score += float(center_reduct_val or 0)
  111. modified_corner_score += float(corner_reduct_val or 0)
  112. modified_edge_score += float(edge_reduct_val or 0)
  113. modified_face_score += float(face_reduct_val or 0)
  114. elif img.image_type == ImageType.back_ring:
  115. center_reduct_val = src.get("result", {}).get("center_result", {}).get("deduct_score", 0)
  116. corner_reduct_val = src.get("result", {}).get("defect_result", {}).get(
  117. "back_corner_deduct_score", 0)
  118. edge_reduct_val = src.get("result", {}).get("defect_result", {}).get("back_edge_deduct_score",
  119. 0)
  120. face_reduct_val = src.get("result", {}).get("defect_result", {}).get("back_face_deduct_score",
  121. 0)
  122. modified_center_score += float(center_reduct_val or 0)
  123. modified_corner_score += float(corner_reduct_val or 0)
  124. modified_edge_score += float(edge_reduct_val or 0)
  125. modified_face_score += float(face_reduct_val or 0)
  126. elif img.image_type == ImageType.front_coaxial:
  127. face_reduct_val = src.get("result", {}).get("defect_result", {}).get("front_face_deduct_score",
  128. 0)
  129. modified_face_score += float(face_reduct_val or 0)
  130. elif img.image_type == ImageType.back_coaxial:
  131. face_reduct_val = src.get("result", {}).get("defect_result", {}).get("back_face_deduct_score",
  132. 0)
  133. modified_face_score += float(face_reduct_val or 0)
  134. except Exception as e:
  135. logger.warning(f"解析 modified_json 分数失败 (image_id={img.id}): {e}")
  136. scores["modified_score"] = modified_score
  137. scores["modified_score_detail"] = {
  138. "modified_center_score": modified_center_score,
  139. "modified_corner_score": modified_corner_score,
  140. "modified_edge_score": modified_edge_score,
  141. "modified_face_score": modified_face_score,
  142. }
  143. except Exception as e:
  144. logger.error(f"计算分数过程异常: {e}")
  145. return scores