card_score_calculate.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. 根据一个包含4张图片的列表,计算原始分数和修改后分数。
  8. 返回一个包含分数详情的字典。
  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. if len(images) != 4:
  28. return scores
  29. try:
  30. # ---------- detection_score ----------
  31. detection_score = 10.0
  32. detection_center_score = 10.0
  33. detection_corner_score = 10.0
  34. detection_edge_score = 10.0
  35. detection_face_score = 10.0
  36. for img in images:
  37. try:
  38. add_val = img.detection_json.get("result", {}).get("_used_compute_deduct_score", 0)
  39. detection_score += float(add_val or 0)
  40. if img.image_type == ImageType.front_edge:
  41. center_reduct_val = img.detection_json.get("result", {}).get("center_result", {}).get(
  42. "deduct_score", 0)
  43. corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  44. "front_corner_deduct_score", 0)
  45. edge_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  46. "front_edge_deduct_score", 0)
  47. detection_center_score += float(center_reduct_val or 0)
  48. detection_corner_score += float(corner_reduct_val or 0)
  49. detection_edge_score += float(edge_reduct_val or 0)
  50. elif img.image_type == ImageType.back_edge:
  51. center_reduct_val = img.detection_json.get("result", {}).get("center_result", {}).get(
  52. "deduct_score", 0)
  53. corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  54. "back_corner_deduct_score", 0)
  55. edge_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  56. "back_edge_deduct_score", 0)
  57. detection_center_score += float(center_reduct_val or 0)
  58. detection_corner_score += float(corner_reduct_val or 0)
  59. detection_edge_score += float(edge_reduct_val or 0)
  60. elif img.image_type == ImageType.front_face:
  61. face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  62. "front_face_deduct_score", 0)
  63. detection_face_score += float(face_reduct_val or 0)
  64. elif img.image_type == ImageType.back_face:
  65. face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
  66. "back_face_deduct_score", 0)
  67. detection_face_score += float(face_reduct_val or 0)
  68. except Exception as e:
  69. logger.warning(f"解析 detection_json 分数失败 (image_id={img.id}): {e}")
  70. scores["detection_score"] = detection_score
  71. scores["detection_score_detail"] = {
  72. "detection_center_score": detection_center_score,
  73. "detection_corner_score": detection_corner_score,
  74. "detection_edge_score": detection_edge_score,
  75. "detection_face_score": detection_face_score,
  76. }
  77. # ---------- modified_score and is_edited status ----------
  78. modified_score = 10.0
  79. modified_center_score = 10.0
  80. modified_corner_score = 10.0
  81. modified_edge_score = 10.0
  82. modified_face_score = 10.0
  83. # 检查是否存在任何非空的 modified_json
  84. is_edited = any(img.modified_json is not None for img in images)
  85. scores["is_edited"] = is_edited
  86. if is_edited:
  87. for img in images:
  88. src = img.modified_json if img.modified_json is not None else img.detection_json
  89. try:
  90. add_val = src.get("result", {}).get("_used_compute_deduct_score", 0)
  91. modified_score += float(add_val or 0)
  92. if img.image_type == ImageType.front_edge:
  93. center_reduct_val = src.get("result", {}).get("center_result", {}).get("deduct_score", 0)
  94. corner_reduct_val = src.get("result", {}).get("defect_result", {}).get(
  95. "front_corner_deduct_score", 0)
  96. edge_reduct_val = src.get("result", {}).get("defect_result", {}).get("front_edge_deduct_score",
  97. 0)
  98. modified_center_score += float(center_reduct_val or 0)
  99. modified_corner_score += float(corner_reduct_val or 0)
  100. modified_edge_score += float(edge_reduct_val or 0)
  101. elif img.image_type == ImageType.back_edge:
  102. center_reduct_val = src.get("result", {}).get("center_result", {}).get("deduct_score", 0)
  103. corner_reduct_val = src.get("result", {}).get("defect_result", {}).get(
  104. "back_corner_deduct_score", 0)
  105. edge_reduct_val = src.get("result", {}).get("defect_result", {}).get("back_edge_deduct_score",
  106. 0)
  107. modified_center_score += float(center_reduct_val or 0)
  108. modified_corner_score += float(corner_reduct_val or 0)
  109. modified_edge_score += float(edge_reduct_val or 0)
  110. elif img.image_type == ImageType.front_face:
  111. face_reduct_val = src.get("result", {}).get("defect_result", {}).get("front_face_deduct_score",
  112. 0)
  113. modified_face_score += float(face_reduct_val or 0)
  114. elif img.image_type == ImageType.back_face:
  115. face_reduct_val = src.get("result", {}).get("defect_result", {}).get("back_face_deduct_score",
  116. 0)
  117. modified_face_score += float(face_reduct_val or 0)
  118. except Exception as e:
  119. logger.warning(f"解析 modified_json 分数失败 (image_id={img.id}): {e}")
  120. scores["modified_score"] = modified_score
  121. scores["modified_score_detail"] = {
  122. "modified_center_score": modified_center_score,
  123. "modified_corner_score": modified_corner_score,
  124. "modified_edge_score": modified_edge_score,
  125. "modified_face_score": modified_face_score,
  126. }
  127. except Exception as e:
  128. logger.error(f"计算分数过程异常: {e}")
  129. return scores