|
|
@@ -1,144 +1,144 @@
|
|
|
-from app.utils.scheme import CardDetailResponse, ImageType
|
|
|
+from app.utils.scheme import ImageType, CardImageResponse
|
|
|
from app.core.logger import get_logger
|
|
|
-from typing import List
|
|
|
+from typing import List, Dict, Any
|
|
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
|
|
|
-def card_score_calculate(card_data: dict, images: List) -> CardDetailResponse:
|
|
|
- card_data["detection_score"] = None
|
|
|
- card_data["modified_score"] = None
|
|
|
- card_data["detection_score_detail"] = {}
|
|
|
- card_data["modified_score_detail"] = {}
|
|
|
- if len(images) == 4:
|
|
|
- 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
|
|
|
+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 = img.detection_json.get("result", {}).get("_used_compute_deduct_score", 0)
|
|
|
- detection_score += float(add_val or 0)
|
|
|
+ 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 = img.detection_json.get("result", {}).get("center_result", {}).get(
|
|
|
- "deduct_score", 0)
|
|
|
- corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
|
|
|
+ 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 = 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)
|
|
|
+ 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 = img.detection_json.get("result", {}).get("center_result", {}).get(
|
|
|
- "deduct_score", 0
|
|
|
- )
|
|
|
- corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get(
|
|
|
+ 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 = 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)
|
|
|
+ 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 = img.detection_json.get("result", {}).get("defect_result", {}).get(
|
|
|
- "front_face_deduct_score", 0)
|
|
|
-
|
|
|
- detection_face_score += float(face_reduct_val or 0)
|
|
|
+ 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 = img.detection_json.get("result", {}).get("defect_result", {}).get(
|
|
|
- "back_face_deduct_score", 0)
|
|
|
-
|
|
|
- detection_face_score += float(face_reduct_val or 0)
|
|
|
+ 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"解析 detection_json 分数失败 (image_id={img.id}): {e}")
|
|
|
- card_data["detection_score"] = detection_score
|
|
|
- card_data["detection_score_detail"]["detection_center_score"] = detection_center_score
|
|
|
- card_data["detection_score_detail"]["detection_corner_score"] = detection_corner_score
|
|
|
- card_data["detection_score_detail"]["detection_edge_score"] = detection_edge_score
|
|
|
- card_data["detection_score_detail"]["detection_face_score"] = detection_face_score
|
|
|
-
|
|
|
- # ---------- modified_score ----------
|
|
|
- modified_score = 10.0
|
|
|
- modified_center_score = 10.0
|
|
|
- modified_corner_score = 10.0
|
|
|
- modified_edge_score = 10.0
|
|
|
- modified_face_score = 10.0
|
|
|
-
|
|
|
- all_modified_none = all(img.modified_json is None for img in images)
|
|
|
- if not all_modified_none:
|
|
|
-
|
|
|
- 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}")
|
|
|
- card_data["modified_score"] = modified_score
|
|
|
-
|
|
|
- card_data["modified_score_detail"]["modified_center_score"] = modified_center_score
|
|
|
- card_data["modified_score_detail"]["modified_corner_score"] = modified_corner_score
|
|
|
- card_data["modified_score_detail"]["modified_edge_score"] = modified_edge_score
|
|
|
- card_data["modified_score_detail"]["modified_face_score"] = modified_face_score
|
|
|
- else:
|
|
|
- card_data["modified_score"] = None
|
|
|
- card_data["modified_score_detail"]["modified_center_score"] = None
|
|
|
- card_data["modified_score_detail"]["modified_corner_score"] = None
|
|
|
- card_data["modified_score_detail"]["modified_edge_score"] = None
|
|
|
- card_data["modified_score_detail"]["modified_face_score"] = None
|
|
|
+ logger.warning(f"解析 modified_json 分数失败 (image_id={img.id}): {e}")
|
|
|
|
|
|
- except Exception as e:
|
|
|
- logger.error(f"计算分数过程异常: {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,
|
|
|
+ }
|
|
|
|
|
|
- # 组合成最终响应
|
|
|
- card_response = CardDetailResponse.model_validate(card_data)
|
|
|
- card_response.images = images
|
|
|
+ except Exception as e:
|
|
|
+ logger.error(f"计算分数过程异常: {e}")
|
|
|
|
|
|
- return card_response
|
|
|
+ return scores
|