VOC数据集mAP计算

5 篇文章 0 订阅
3 篇文章 0 订阅

检测出来的bbox包含score和bbox,按照score降序排序,所以每添加一个样本,就代表阈值降低一点(真实情况下score降低,iou不一定降低)。这样就是可以有很多种阈值,每个阈值情况下计算一个prec和recall。

d:对模型检测到的bbox循环:
j:对该bbox对应的图像(i)中所有的gt循环:
如果bb和bbgt有重叠:
计算ov=重叠部分面积/联合的面积,并记录ovmax,jmax
如果ovmax大于阈值:
如果i图像的第jmax个gt的diff(是否为diffcilut样本)不为0
如果i图像的第jmax个gt的det为0,则tp(d)=1,标记为true positive
如果i图像的第jmax个gt的det不为0,则fp(d)=1,标记为false positive(mutlti detection)
否则,
fp(d)=1,标记为false positive


1)采样计算
取召回率为0,0.1,0.2,...,1,计算准确率最大值(若为空,则设为0;此处的假设是prec曲线是递减的),然后取11个点的平均。


2)auc曲线计算
填补auc曲线中的沟;(如果prec在开始出现下降,则认为此时iou<0.5是出现了误判,iou不能作为唯一评判标准;这时将后面出现的prec的较大值往前填补)。
找到rec的突变点;计算面积



图像检测的AP:
1. 使用区域选择算法(如selective search)得到候选区域
2. 对候选区域,计算每一个候选区域和标定框(groud truth)的iou
3. 设定一个iou阈值,大于这个的标为正样本,小于的标为负样本,由此得到一个类似于分类时的测试集
4. 将给定的测试集(正负样本),通过分类器,算出每一个图片是正样本的score
5. 设定一个score阈值,大于等于此值的视作正样本,小于的作为正样本
6. 根据上一步的结果可以算出准确率和召回率
7. 调节score阈值,算出召回率从0到1时的准确率,得到一条曲线
8. 计算曲线的下面积 则为AP




function [rec,prec,ap] = VOCevaldet(VOCopts,id,cls,draw)

% load test set
[gtids,t]=textread(sprintf(VOCopts.imgsetpath,VOCopts.testset),'%s %d');

% load ground truth objects
tic;
npos=0;
gt(length(gtids))=struct('BB',[],'diff',[],'det',[]);
for i=1:length(gtids)
    % display progress
    if toc>1
        fprintf('%s: pr: load: %d/%d\n',cls,i,length(gtids));
        drawnow;
        tic;
    end
    
    % read annotation
    rec=PASreadrecord(sprintf(VOCopts.annopath,gtids{i}));
    
    % extract objects of class
    clsinds=strmatch(cls,{rec.objects(:).class},'exact');
    gt(i).BB=cat(1,rec.objects(clsinds).bbox)';
    gt(i).diff=[rec.objects(clsinds).difficult];
    gt(i).det=false(length(clsinds),1);
    npos=npos+sum(~gt(i).diff);
end

% load results
[ids,confidence,b1,b2,b3,b4]=textread(sprintf(VOCopts.detrespath,id,cls),'%s %f %f %f %f %f');
BB=[b1 b2 b3 b4]';

% sort detections by decreasing confidence
[sc,si]=sort(-confidence);   %按照score排序
ids=ids(si);
BB=BB(:,si);

% assign detections to ground truth objects
nd=length(confidence);
tp=zeros(nd,1);
fp=zeros(nd,1);
tic;
for d=1:nd
    % display progress
    if toc>1
        fprintf('%s: pr: compute: %d/%d\n',cls,d,nd);
        drawnow;
        tic;
    end
    
    % find ground truth image
    i=strmatch(ids{d},gtids,'exact');
    if isempty(i)
        error('unrecognized image "%s"',ids{d});
    elseif length(i)>1
        error('multiple image "%s"',ids{d});
    end

    % assign detection to ground truth object if any
    bb=BB(:,d);
    ovmax=-inf;
    for j=1:size(gt(i).BB,2)
        bbgt=gt(i).BB(:,j);
        bi=[max(bb(1),bbgt(1)) ; max(bb(2),bbgt(2)) ; min(bb(3),bbgt(3)) ; min(bb(4),bbgt(4))];
        iw=bi(3)-bi(1)+1;
        ih=bi(4)-bi(2)+1;
        if iw>0 & ih>0                
            % compute overlap as area of intersection / area of union
            ua=(bb(3)-bb(1)+1)*(bb(4)-bb(2)+1)+...
               (bbgt(3)-bbgt(1)+1)*(bbgt(4)-bbgt(2)+1)-...
               iw*ih;
            ov=iw*ih/ua;
            if ov>ovmax
                ovmax=ov;
                jmax=j;
            end
        end
    end
    % assign detection as true positive/don't care/false positive
    if ovmax>=VOCopts.minoverlap
        if ~gt(i).diff(jmax)
            if ~gt(i).det(jmax)
                tp(d)=1;            % true positive
		        gt(i).det(jmax)=true;
            else
                fp(d)=1;            % false positive (multiple detection)   %对于同一个gt,找到了多个目标,则后续目标设为FP
            end
        end
    else
        fp(d)=1;                    % false positive
    end
end

% compute precision/recall
fp=cumsum(fp);
tp=cumsum(tp);
rec=tp/npos;
prec=tp./(fp+tp);

% compute average precision

ap=0;
for t=0:0.1:1
    p=max(prec(rec>=t));
    if isempty(p)
        p=0;
    end
    ap=ap+p/11;
end

if draw
    % plot precision/recall
    plot(rec,prec,'-');
    grid;
    xlabel 'recall'
    ylabel 'precision'
    title(sprintf('class: %s, subset: %s, AP = %.3f',cls,VOCopts.testset,ap));
end

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于Faster_RCNN网络模型的车辆、行人及交通信号目标检测算法python源码+数据集+项目报告+详细注释.zip ## 环境配置: * Python3.6/3.7/3.8 * Pytorch1.6(注意:必须是1.6.0或以上,因为使用官方提供的混合精度训练1.6.0后才支持) * pycocotools(Linux:```pip install pycocotools```; Windows:```pip install pycocotools-windows```(不需要额外安装vs)) * Ubuntu或Centos(不建议Windows) * 最好使用GPU训练 * 详细环境配置见```requirements.txt``` ## 文件结构: ``` ├── backbone: 特征提取网络,可以根据自己的要求选择 ├── network_files: Faster R-CNN网络(包括Fast R-CNN以及RPN等模块) ├── train_utils: 训练验证相关模块(包括cocotools) ├── my_dataset.py: 自定义dataset用于读取VOC数据集 ├── train_mobilenet.py: 以MobileNetV2做为backbone进行训练 ├── train_resnet50_fpn.py: 以resnet50+FPN做为backbone进行训练 ├── train_multi_GPU.py: 针对使用多GPU的用户使用 ├── predict.py: 简易的预测脚本,使用训练好的权重进行预测测试 ├── validation.py: 利用训练好的权重验证/测试数据的COCO指标,并生成record_mAP.txt文件 └── pascal_voc_classes.json: pascal_voc标签文件 ``` ## 预训练权重下载地址(下载后放入backbone文件夹中): * MobileNetV2 backbone: https://download.pytorch.org/models/mobilenet_v2-b0353104.pth * ResNet50+FPN backbone: https://download.pytorch.org/models/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth * 注意,下载的预训练权重记得要重命名,比如在train_resnet50_fpn.py中读取的是```fasterrcnn_resnet50_fpn_coco.pth```文件, 不是```fasterrcnn_resnet50_fpn_coco-258fb6c6.pth``` ## 数据集,本例程使用的是PASCAL VOC2012数据集 * Pascal VOC2012 train/val数据集下载地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar * 使用ResNet50+FPN以及迁移学习在VOC2012数据集上得到的权重: 链接:https://pan.baidu.com/s/1ifilndFRtAV5RDZINSHj5w 提取码:dsz8 ## 训练方法 * 确保提前准备好数据集 ......
您好!对于使用YOLOv8训练VOC数据集,您可以按照以下步骤进行操作: 1. 数据集准备:下载VOC数据集并解压。VOC数据集包含图像和相应的标签文件,其中标签文件以XML格式提供。 2. 数据集转换:将VOC数据集转换为YOLO格式。YOLO的标签格式是每个图像对应一个txt文件,其中包含每个边界框的类别和边界框坐标。您可以使用脚本或工具来进行转换。 3. 配置文件:修改YOLOv8的配置文件。您需要指定类别数量、训练和测试的图像路径、模型超参数等。确保正确设置anchors(锚点)以及相关参数。 4. 模型训练:使用转换后的数据集和修改后的配置文件进行模型训练。您可以使用预训练权重来加快收敛速度,并在训练过程中逐渐降低学习率以提高模型性能。 5. 模型评估:训练完成后,您可以使用测试集来评估模型的性能。使用工具或脚本来计算平均精度(mAP)等指标。 6. 模型推理:使用训练好的模型进行目标检测。您可以使用YOLOv8提供的推理代码或自定义代码来实现。 请注意,以上只是一个简单的概述,具体的实施步骤可能会因您的具体需求和环境而有所不同。在实际操作中,您可能还需要关注数据增强、模型调优等方面。建议参考YOLOv8的官方文档或相关教程以获取更详细的指导。祝您成功训练VOC数据集!如果您对其他问题有疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值