YOLOv12源码:https://github.com/sunsmarterjie/yolov12
第一步:更改Val.py文件
地址:该文件在yolov12-main\ultralytics\models\yolo\detect下
首先定位到def get_desc(self):这个函数上
代码修正如下:
def get_desc(self):
"""Return a formatted string summarizing class metrics of YOLO model."""
return ("%22s" + "%11s" * 7) % ("Class", "Images", "Instances", "Box(P", "R", "mAP50", "mAP75", "mAP50-95)")
然后再定位到def eval_json(self, stats):这个函数上,这个函数的末尾
代码修正如下:
# update mAP50 mAP75 and mAP50-95
stats[self.metrics.keys[-1]], stats[self.metrics.keys[-2]], stats[self.metrics.keys[-3]]= (
val.stats[:3] if self.is_coco else [val.results["AP50"], val.results["AP75"], val.results["AP"]]
)
第二步:更改metrics.py文件
首先定位到这个def ap50(self):函数
在ap50和ap中间增加一个函数如下所示
@property
def ap75(self):
"""
Returns the Average Precision (AP) at an IoU threshold of 0.5 for all classes.
Returns:
(np.ndarray, list): Array of shape (nc,) with AP50 values per class, or an empty list if not available.
"""
return self.all_ap[:, 5] if len(self.all_ap) else []
然后再定位到mean_results(self):这个函数上
更改上图中的这三个函数 mean_results(self): class_result(self, i): fitness(self):
def mean_results(self):
"""Mean of results, return mp, mr, map50, map75, map."""
return [self.mp, self.mr, self.map50, self.map75, self.map]
def class_result(self, i):
"""Class-aware result, return p[i], r[i], ap50[i], ap75[i], ap[i]."""
return self.p[i], self.r[i], self.ap50[i], self.ap75[i], self.ap[i]
def fitness(self):
"""Model fitness as a weighted combination of metrics."""
w = [0.0, 0.0, 0.1, 0.1, 0.9] # weights for [P, R, mAP@0.5, mAP@0.75, mAP@0.5:0.95]
return (np.array(self.mean_results()) * w).sum()
再往下定位到def keys(self):这个函数上
def keys(self):
"""Returns a list of keys for accessing specific metrics."""
return ["metrics/precision(B)", "metrics/recall(B)", "metrics/mAP50(B)", 'metrics/mAP75(B)', "metrics/mAP50-95(B)"]
再往下定位def keys(self):还是这个函数
def keys(self):
"""Returns a list of keys for accessing metrics."""
return [
"metrics/precision(B)",
"metrics/recall(B)",
"metrics/mAP50(B)",
"metrics/mAP50-95(B)",
"metrics/mAP75(B)",
"metrics/precision(M)",
"metrics/recall(M)",
"metrics/mAP50(M)",
"metrics/mAP75(M)",
"metrics/mAP50-95(M)",
]
def keys(self):
"""Returns list of evaluation metric keys."""
return [
"metrics/precision(B)",
"metrics/recall(B)",
"metrics/mAP50(B)",
"metrics/mAP75(B)",
"metrics/mAP50-95(B)",
"metrics/precision(P)",
"metrics/recall(P)",
"metrics/mAP50(P)",
"metrics/mAP75(P)",
"metrics/mAP50-95(P)",
]
def keys(self):
"""Returns a list of keys for accessing specific metrics."""
return ["metrics/precision(B)", "metrics/recall(B)", "metrics/mAP50(B)", "metrics/mAP75(B)", "metrics/mAP50-95(B)"]
到此代码更改完毕,训练的时候就能出现map75指标了