yolo目标检测PR指标计算

目标检测yolo格式数据,给定置信度阈值和iou阈值时的PR指标计算脚本。
labels文件夹下标签文件格式:cls x y w h
在这里插入图片描述
results文件夹下预测结果格式:cls x y w h conf
在这里插入图片描述
注意:labels文件夹和results文件夹下的txt名称要对应,比如labels/1.txt对应1.jpg的标签,results/1.txt对应1.jpg的预测结果。

from pathlib import Path


annotation_dir = r'./labels/'   #labels的路径
prediction_dir = r'./results/'  #预测结果路径

ann_files = Path(annotation_dir).glob('*')
pre_files = Path(prediction_dir).glob('*')

annotation = {}
prediction = {}

CONF_THRE = 0.5 #置信度阈值
IOU_THRE = 0.5  #iou阈值


for ann_file in ann_files:  
    annotation[Path(ann_file).name] = []
    with open(ann_file,'r') as fin:
        for line in fin:
            line_list = line.split()     
            x_min = float(line_list[1])-float(line_list[3])/2
            y_min = float(line_list[2])-float(line_list[4])/2
            x_max = float(line_list[1])+float(line_list[3])/2
            y_max = float(line_list[2])+float(line_list[4])/2
            obj = [x_min, y_min, x_max, y_max, int(line_list[0])] #x_min, y_min, x_max, y_max, annotation_class_id
            annotation[Path(ann_file).name].append(obj)

for pre_file in pre_files:  
    prediction[Path(pre_file).name] = []
    with open(pre_file,'r') as fin:
        for line in fin:
            line_list = line.split()    
            x_min = float(line_list[1])-float(line_list[3])/2
            y_min = float(line_list[2])-float(line_list[4])/2
            x_max = float(line_list[1])+float(line_list[3])/2
            y_max = float(line_list[2])+float(line_list[4])/2
            obj = [x_min, y_min, x_max, y_max, int(line_list[0])] #x_min, y_min, x_max, y_max, prediction_class_id
            if float(line_list[5]) >= CONF_THRE:
                prediction[Path(pre_file).name].append(obj)
 

def calculate_iou(rect1,rect2):
    overlap_x1 = max(rect1[0], rect2[0])
    overlap_y1 = max(rect1[1], rect2[1])
    overlap_x2 = min(rect1[2], rect2[2])
    overlap_y2 = min(rect1[3], rect2[3])
    if overlap_x2 - overlap_x1 <=0 or overlap_y2 - overlap_y1 <= 0:
        return 0
    iou_area = (overlap_x2 - overlap_x1)*(overlap_y2 - overlap_y1)
    union_area = (rect1[2] - rect1[0]) * (rect1[3] - rect1[1]) + (rect2[2] - rect2[0]) * (rect2[3] - rect2[1]) - iou_area
    return float(iou_area) / union_area


correct_obj_num = 0
prediction_obj_num = 0
annotation_obj_num = 0

for key, value in annotation.items():
    annotation_obj_num += len(value)
    if key in prediction:
        prediction_value = prediction[key]
        prediction_obj_num += len(prediction_value)
        for i in range(len(prediction_value)):
            for j in range(len(value)):
                iou = calculate_iou(prediction_value[i], value[j])
                if iou >= IOU_THRE and prediction_value[i][4] == value[j][4]:
                    correct_obj_num += 1
                    break

P = float(correct_obj_num) / prediction_obj_num
R = float(correct_obj_num) / annotation_obj_num
print('Precision ratio: ',P)
print('Recall ratio: ',R)                                      
### 如何优化 YOLO 目标检测精度与性能 #### 调整超参数 调整超参数对于提升YOLO模型的表现至关重要。通过网格搜索或随机搜索方法来寻找最优的学习率、批量大小其他重要参数能够显著改善模型表现[^1]。 #### 使用更强大的数据增强技术 采用多样化的图像变换方式作为数据扩充手段,比如随机裁剪、颜色抖动以及水平翻转等操作可以帮助增加训练集多样性,从而让模型学习到更多不变性特征,进而提高泛化能力[^2]。 #### 应用混合精度训练 利用半精度浮点数(FP16)代替单精度浮点数(FP32),可以在不损失太多计算资源的情况下加快训练速度并减少内存占用,同时也有助于防止过拟合现象的发生。 #### 集成测试时间增强(TTA) TTA是一种有效的策略,在推理阶段通过对输入图片施加多种变化形式后再送入网络预测最后取平均值的方式得到最终结果,以此达到稳定输出的目的,进一步提升了检测质量。 #### 利用迁移学习初始化权重 当面对特定领域内的新任务时,可以从已经预先训练好的通用物体识别模型中加载部分层的参数作为初始状态来进行微调,这样不仅节省了大量的标注成本而且往往可以获得更好的效果。 ```python import torch.nn as nn from yolov8 import YOLOv8Model model = YOLOv8Model(pretrained=True) for param in model.backbone.parameters(): param.requires_grad = False new_layers = nn.Sequential( # 定义新的可训练层... ).to(device) model.head = new_layers ``` #### 增强评估指标监控 除了传统的mAP之外,还可以考虑引入其他补充性的评价标准如F1分数或者PR曲线下的面积(AUC-PRC),以便全面地理解模型在整个工作范围内的行为特性,并据此做出相应的调整措施[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给算法爸爸上香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值