| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- from app.utils.scheme import ImageType, CardImageResponse
- from app.core.logger import get_logger
- from typing import List, Dict, Any
- logger = get_logger(__name__)
- def calculate_scores_from_images(images: List[CardImageResponse]) -> Dict[str, Any]:
- """
- 根据一个包含4张图片的列表,计算原始分数和修改后分数。
- 返回一个包含分数详情的字典。
- """
- scores = {
- "detection_score": None,
- "modified_score": None,
- "detection_score_detail": {
- "detection_center_score": None,
- "detection_corner_score": None,
- "detection_edge_score": None,
- "detection_face_score": None
- },
- "modified_score_detail": {
- "modified_center_score": None,
- "modified_corner_score": None,
- "modified_edge_score": None,
- "modified_face_score": None
- },
- "is_edited": False,
- }
- if len(images) != 4:
- return scores
- try:
- # ---------- detection_score ----------
- detection_score = 10.0
- detection_center_score = 10.0
- detection_corner_score = 10.0
- detection_edge_score = 10.0
- detection_face_score = 10.0
- for img in images:
- try:
- add_val = img.detection_json.get("result", {}).get("_used_compute_deduct_score", 0)
- detection_score += float(add_val or 0)
- if img.image_type == ImageType.front_edge:
- center_reduct_val = img.detection_json.get("result", {}).get("center_result", {}).get(
- "deduct_score", 0)
- corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
- "front_corner_deduct_score", 0)
- edge_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
- "front_edge_deduct_score", 0)
- detection_center_score += float(center_reduct_val or 0)
- detection_corner_score += float(corner_reduct_val or 0)
- detection_edge_score += float(edge_reduct_val or 0)
- elif img.image_type == ImageType.back_edge:
- center_reduct_val = img.detection_json.get("result", {}).get("center_result", {}).get(
- "deduct_score", 0)
- corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
- "back_corner_deduct_score", 0)
- edge_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
- "back_edge_deduct_score", 0)
- detection_center_score += float(center_reduct_val or 0)
- detection_corner_score += float(corner_reduct_val or 0)
- detection_edge_score += float(edge_reduct_val or 0)
- elif img.image_type == ImageType.front_face:
- face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
- "front_face_deduct_score", 0)
- detection_face_score += float(face_reduct_val or 0)
- elif img.image_type == ImageType.back_face:
- face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
- "back_face_deduct_score", 0)
- detection_face_score += float(face_reduct_val or 0)
- except Exception as e:
- logger.warning(f"解析 detection_json 分数失败 (image_id={img.id}): {e}")
- scores["detection_score"] = detection_score
- scores["detection_score_detail"] = {
- "detection_center_score": detection_center_score,
- "detection_corner_score": detection_corner_score,
- "detection_edge_score": detection_edge_score,
- "detection_face_score": detection_face_score,
- }
- # ---------- modified_score and is_edited status ----------
- modified_score = 10.0
- modified_center_score = 10.0
- modified_corner_score = 10.0
- modified_edge_score = 10.0
- modified_face_score = 10.0
- # 检查是否存在任何非空的 modified_json
- is_edited = any(img.modified_json is not None for img in images)
- scores["is_edited"] = is_edited
- if is_edited:
- for img in images:
- src = img.modified_json if img.modified_json is not None else img.detection_json
- try:
- add_val = src.get("result", {}).get("_used_compute_deduct_score", 0)
- modified_score += float(add_val or 0)
- if img.image_type == ImageType.front_edge:
- center_reduct_val = src.get("result", {}).get("center_result", {}).get("deduct_score", 0)
- corner_reduct_val = src.get("result", {}).get("defect_result", {}).get(
- "front_corner_deduct_score", 0)
- edge_reduct_val = src.get("result", {}).get("defect_result", {}).get("front_edge_deduct_score",
- 0)
- modified_center_score += float(center_reduct_val or 0)
- modified_corner_score += float(corner_reduct_val or 0)
- modified_edge_score += float(edge_reduct_val or 0)
- elif img.image_type == ImageType.back_edge:
- center_reduct_val = src.get("result", {}).get("center_result", {}).get("deduct_score", 0)
- corner_reduct_val = src.get("result", {}).get("defect_result", {}).get(
- "back_corner_deduct_score", 0)
- edge_reduct_val = src.get("result", {}).get("defect_result", {}).get("back_edge_deduct_score",
- 0)
- modified_center_score += float(center_reduct_val or 0)
- modified_corner_score += float(corner_reduct_val or 0)
- modified_edge_score += float(edge_reduct_val or 0)
- elif img.image_type == ImageType.front_face:
- face_reduct_val = src.get("result", {}).get("defect_result", {}).get("front_face_deduct_score",
- 0)
- modified_face_score += float(face_reduct_val or 0)
- elif img.image_type == ImageType.back_face:
- face_reduct_val = src.get("result", {}).get("defect_result", {}).get("back_face_deduct_score",
- 0)
- modified_face_score += float(face_reduct_val or 0)
- except Exception as e:
- logger.warning(f"解析 modified_json 分数失败 (image_id={img.id}): {e}")
- scores["modified_score"] = modified_score
- scores["modified_score_detail"] = {
- "modified_center_score": modified_center_score,
- "modified_corner_score": modified_corner_score,
- "modified_edge_score": modified_edge_score,
- "modified_face_score": modified_face_score,
- }
- except Exception as e:
- logger.error(f"计算分数过程异常: {e}")
- return scores
|