yolov3 tf2计算自己数据集的mAP Ap PR曲线

原文:
https://blog.csdn.net/weixin_42990953/article/details/105182238?utm_medium=distribute.pc_relevant_download.none-task-blog-2defaultsearchFromBaidudefault-16.test_version_3&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-2defaultsearchFromBaidudefault-16.test_version_

https://blog.csdn.net/weixin_41243159/article/details/103748428

小白参考了几位大佬的博客,记录一下防止忘了,然后自己进行了相应修改,实现计算VOC格式数据集测试集map,ap,pr,最后执行完mian.py文件后会生成每类的AP,PR曲线图。
如:yolov3 tf2计算自己数据集的mAP Ap PR曲线
yolov3 tf2计算自己数据集的mAP Ap PR曲线

文章目录
前言
MAP计算
1.下载源码
2. images-optional文件夹
3.ground_truth文件夹
3.1导入xml到ground_truth文件夹
3.2将上面xml文件转换成txt文件
4.detection-results文件夹
4.1制作result.txt
4.2对result.txt切割
4.2执行main.py
5.参考
前言
1.MAP相关概念
https://blog.csdn.net/plSong_CSDN/article/details/89459175
2.MAP计算源码地址:https://github.com/Cartucho/mAP

MAP计算
参考博客https://blog.csdn.net/weixin_41243159/article/details/103748428
实现mAP的计算主要就是把相应的文件放入到 detection_results, ground_truth, images-optional 这三个文件夹中,然后根据压缩包里的main.py 文件直接生成结果。

1.下载源码
见上

  1. images-optional文件夹
    放测试图片。两种方式:自定义测试集和voc测试集。自定义就是自己复制粘贴需要测试的图片,VOC数据集测试集是通过yolov3中VOC数据集生成的test.txt文件,里面为测试集图片编号。
    yolov3 tf2计算自己数据集的mAP Ap PR曲线

新建下面代码find_test_jpg.py傻瓜式转移test.txt文件对应在JPEGImages的图片到images-optional中去,使用的是绝对路径。执行完后会在images-optional加入test.txt对应的原图。
import os
import shutil

test_image_filepath = ‘xxx/VOCdevkit/VOC2007/JPEGImages/’
test_name_filepath=‘xxx/VOCdevkit/VOC2007/ImageSets/Main/test.txt’
test_image_savepath = ‘xxx/mAP-master/input/images-optional/’

L=[]

‘’‘使用voc分好的数据集测试集’’’
f2 = open(test_name_filepath,“r”)
lines = f2.readlines()
for line3 in lines:
line3 = line3.strip()
name = line3 + ‘.jpg’
L.append(name)
for filename in L:
shutil.copy(os.path.join(test_image_filepath,filename),test_image_savepath)

3.ground_truth文件夹
存放真实值,格式如下图为:classname left top right bottom。需要根据xml文件生成txt文件。因此先导入xml文件,再转换。
yolov3 tf2计算自己数据集的mAP Ap PR曲线

3.1导入xml到ground_truth文件夹
新建test_txt_findxml.py,写好路径执行,将xml文件放入ground_truth文件夹。
import os
import shutil

xmlfilepath = ‘xxx/VOCdevkit/VOC2007/Annotations/’
testfilepath=‘xxx/VOCdevkit/VOC2007/ImageSets/Main/test.txt’
xmlsavepath = ‘xxx/mAP-master/input/ground-truth/’

L=[]

‘’‘使用voc分好的数据集测试集’’’
f2 = open(testfilepath,“r”)
lines = f2.readlines()
for line3 in lines:
print(line3)
line3 = line3.strip()
name = line3 + ‘.xml’
L.append(name)
print(L)
for filename in L:
shutil.copy(os.path.join(xmlfilepath,filename),xmlsavepath)

3.2将上面xml文件转换成txt文件
打开mAP-master/scripts/extra/covert_gt_xml.py 文件。执行后,xml文件自动放进了ground_truth/backup中,然后在ground_truth下生成了txt文件。

4.detection-results文件夹
4.1制作result.txt
下载yolo_test.pyGithub:https://github.com/plsong/keras-yolo3-test
进行修改:https://blog.csdn.net/weixin_41243159/article/details/103748428
然后执行yolo_test.py,生成result/result.txt
yolov3 tf2计算自己数据集的mAP Ap PR曲线

4.2对result.txt切割
新建make_dr.py ,执行得到detection-results文件夹下的txt文件
f=open(‘xxx/result/result.txt’,encoding=‘utf8’)
s=f.readlines()
result_path=‘xxx/mAP-master/input/detection-results/’

for i in range(len(s)): # 中按行存放的检测内容,为列表的形式
r = s[i].split(’.jpg ‘)
file = open(result_path + r[0] + ‘.txt’, ‘w’)
if len(r[1]) > 5:
t = r[1].split(’;’)
# print(‘len(t):’,len(t))
if len(t) == 3:
file.write(t[0] + ‘\n’ + t[1] + ‘\n’) # 有两个对象被检测出
elif len(t) == 4:
file.write(t[0] + ‘\n’ + t[1] + ‘\n’ + t[2] + ‘\n’) # 有三个对象被检测出
elif len(t) == 5:
file.write(t[0] + ‘\n’ + t[1] + ‘\n’ + t[2] + ‘\n’ + t[3] + ‘\n’) # 有四个对象被检测出
elif len(t) == 6:
file.write(t[0] + ‘\n’ + t[1] + ‘\n’ + t[2] + ‘\n’ + t[3] + ‘\n’ + t[4] + ‘\n’) # 有五个对象被检测出
elif len(t) == 7:
file.write(t[0] + ‘\n’ + t[1] + ‘\n’ + t[2] + ‘\n’ + t[3] + ‘\n’ + t[4] + ‘\n’ + t[5] + ‘\n’) # 有六个对象被检测出

    else:
        file.write(t[0] + '\n')  # 有一个对象
else:
    file.write('')  # 没有检测出来对象,创建一个空白的对象

得到txt如下图所示,每张图片对应一个txt
yolov3 tf2计算自己数据集的mAP Ap PR曲线

4.2执行main.py
执行结果在output中。很明显,数据没训练好,样本太少,计算机硬件资源也不够。
yolov3 tf2计算自己数据集的mAP Ap PR曲线

5.参考
YOLOV3-keras版本下计算自己数据集的mAP
YOLOV3-keras-MAP】YOLOV3-keras版本的mAP计算
————————————————
版权声明:本文为CSDN博主「一盘炒饭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42990953/article/details/105182238

上一篇:Ground plane fin-shaped field effect transistor (GP-FinFET): A FinFET for low leakage power circuits


下一篇:关于232,422接口