YOLOv4 绘制PR曲线

  • 简述
    • YOLOv4 自带mAP检测代码
    • 第三方库

简述

最近做的一项工作就是交通目标的识别,我用的是YOLOv4基于Darknet的那一版,其中最重要的评价一项目标检测,但是我试过YOLOv4自带的map和网上常用的绘制PR曲线的方法进行对比,发现计算得到的map有一定差距,于是我想找一个第三方的库来试试。找来找去还真让我发现一个,https://github.com/Cartucho/mAP,接下来,我详细说一下应该怎么使用。

YOLOv4 自带mAP检测代码

darknet.exe detector map data/obj.data cfg/yolov4_custom.cfg backup/yolov4_custom.weights
那么yolov4其实自带了一套检测工具,其他博主也有写,例如这位博主写的:https://blog.csdn.net/qq_44929031/article/details/113355506
但是我尝试了一下,发现mAP差5%,不知道是什么原因,有懂的小伙伴可以留言告诉我。

第三方库

因为我的本行是搞汽车的,不是写代码的,所以代码写的不太好还请多包涵。
这边先把库拖下来,我们可以看到这个库需要一个input


这个input文件夹中两个文件是必须的,那就是detection-results和ground-truth,通过官网,我们看到detection-results里面的要求是这样子的,那就是类别的名字,置信度和位置坐标,
tvmonitor 0.471781 0 13 174 244
cup 0.414941 274 226 301 265
book 0.460851 429 219 528 247
chair 0.292345 0 199 88 436
book 0.269833 433 260 506 336
而ground-truth的要求是这样子,
tvmonitor 2 10 173 238
book 439 157 556 241
book 437 246 518 351
pottedplant 272 190 316 259
名字坐标即可,如果是难例可以标上难例。
但是yolo中类别是数字形式表达,然后位置坐标页不太一致,所以需要转换一下,我贴一下我的代码:

import os
from tqdm import tqdm
from PIL import Imagelabel = {'0' : 'car', '1' : 'van', '2' : 'truck', '3' : 'bus'}
fig_path = 'C:/Users/Frank/Desktop/Validation/'
rd = 'C:/Users/Frank/Desktop/工具/PR曲线/input/ground-truth/'
anns = os.listdir(rd)for image_id in tqdm(anns):f = open(rd+image_id,'r')annotation = ''for line in f.readlines():img = Image.open(fig_path + image_id[:-3] + 'jpg')img_size = img.sizeobj_name = label[str(line.strip()[0])]left = (float(line.split()[1]) - float(line.split()[3])/2)*img_size[0]right = (float(line.split()[1]) + float(line.split()[3])/2)*img_size[0]top = (float(line.split()[2]) - float(line.split()[4])/2)*img_size[1]bottom = (float(line.split()[2]) + float(line.split()[4])/2)*img_size[1]annotation = annotation + "%s %s %s %s %s\n" % (obj_name, int(left), int(top), int(right), int(bottom))with open('C:/Users/Frank/Desktop/工具/PR曲线/input/ground-truth/'+ image_id, 'w') as outfile:outfile.write(annotation)

然后我们要应用yolov4自带的valid的命令,对我们需要测试的数据集进行检测,并得到结果,那么我这边用的是python直接调用的cmd命令。

import os
import cv2
import linecachecmd = 'cd C:/darknet/build/darknet/x64&\darknet.exe detector test cfg/obj.data cfg/yolov4_original_imbalanced.cfg\backup/yolov4_original_imbalanced_10000.weights -thresh 0.01 -dont_show -ext_output < data/valid.txt > result.txt'
os.system(cmd)result_path = "C:/darknet/build/darknet/x64/result.txt"

这里的thresh应该指的是类别的置信度,因为如果要求pr曲线,就要求每个置信度对应下的precision和recall的值,但是yolo里还有一个阈值,那就是iou的阈值,一般都是0.5,同时这个第三方库中的iou阈值也是0.5,暂时不支持其他的阈值,所以如果做竞赛这个库应该也不太行。这里可能我理解的也不太对,欢迎小伙伴指正。那么我们就得到了这样的result文件,可以看到yolov4还是很不友好的,这里也要我们转换一下。

我是这样转换的,方法可能有点苯

f = open(result_path,'r')
file_path = "C:/Users/Frank/Desktop/Validation/"
path = 'C:/Users/Frank/Desktop/工具/PR曲线/input/detection-results/'
array = []
name = []
j = 1
for line in f.readlines():if line.find(file_path)!=-1:array.append(j)name.append(line.replace(file_path,'').split('.jpg', 1)[0])j = j + 1array.append(j)for i in range(len(array) -1):start = array[i]end = array[i+1]annotation = ''name_label = name[i]for j in range(start, end):line = linecache.getline(result_path, j).strip()if line[:3] == 'car':left_x = float(line.split('left_x:',1)[1].split('top_y:',1)[0])top_y = float(line.split('top_y:',1)[1].split('width:',1)[0])width = float(line.split('width:',1)[1].split('height:',1)[0])height = float(line.split('height:',1)[1].split(')',1)[0])score = float(line.split(':',1)[1].split('%',1)[0])left = abs(int(left_x))right = abs(int(left_x + width))top = abs(int(top_y))bottom = abs(int(top_y + height))score = float (score/100)annotation = annotation +'car'+' '+str(score)+' '+str(left)+' '+str(top)+' '+str(right)+' '+str(bottom)+'\n'if line[:3] == 'van':left_x = float(line.split('left_x:',1)[1].split('top_y:',1)[0])top_y = float(line.split('top_y:',1)[1].split('width:',1)[0])width = float(line.split('width:',1)[1].split('height:',1)[0])height = float(line.split('height:',1)[1].split(')',1)[0])score = float(line.split(':',1)[1].split('%',1)[0])left = abs(int(left_x))right = abs(int(left_x + width))top = abs(int(top_y))bottom = abs(int(top_y + height))score = float (score/100)annotation = annotation +'van'+' '+str(score)+' '+str(left)+' '+str(top)+' '+str(right)+' '+str(bottom)+'\n'if line[:3] == 'tru':left_x = float(line.split('left_x:',1)[1].split('top_y:',1)[0])top_y = float(line.split('top_y:',1)[1].split('width:',1)[0])width = float(line.split('width:',1)[1].split('height:',1)[0])height = float(line.split('height:',1)[1].split(')',1)[0])score = float(line.split(':',1)[1].split('%',1)[0])left = abs(int(left_x))right = abs(int(left_x + width))top = abs(int(top_y))bottom = abs(int(top_y + height))score = float (score/100)annotation = annotation +'truck'+' '+str(score)+' '+str(left)+' '+str(top)+' '+str(right)+' '+str(bottom)+'\n'if line[:3] == 'bus':left_x = float(line.split('left_x:',1)[1].split('top_y:',1)[0])top_y = float(line.split('top_y:',1)[1].split('width:',1)[0])width = float(line.split('width:',1)[1].split('height:',1)[0])height = float(line.split('height:',1)[1].split(')',1)[0])score = float(line.split(':',1)[1].split('%',1)[0])left = abs(int(left_x))right = abs(int(left_x + width))top = abs(int(top_y))bottom = abs(int(top_y + height))score = float (score/100)annotation = annotation +'bus'+' '+str(score)+' '+str(left)+' '+str(top)+' '+str(right)+' '+str(bottom)+'\n'outpath = path + name_label + '.txt'with open(outpath, 'w') as outfile:outfile.write(annotation)

最后一个image-optional是放图片的,放不放都可以,放图片之后会有可视化的效果。
到这里,所有的input就准备好了,接下来就运行get_map.py就能得到PR曲线了。

Have fun.
[1] https://github.com/Cartucho/mAP

YOLOv4 绘制PR曲线相关推荐

  1. yolo模型(四)绘制PR曲线所用到的reval_voc_py.py代码

    在绘制PR曲线时要自己生成一个pkl文件,需要reval_voc_py.py代码来生.现贴出基于python2和python3的代码,按照自己的python版本直接复制即可.拿走不谢~ reval_v ...

  2. 机器学习入门案例:鸢尾花数据集分类 绘制PR曲线

    案例使用鸢尾花数据集进行分类预测,并绘制评价分类性能的PR曲线图 认识分类任务和数据集 Iris(鸢尾花)数据集 案例演示中使用的是有监督的机器学习算法:SVM 支持向量机 建立模型的流程如下: 训练 ...

  3. python画pr曲线代码_Yolov3测试图及绘制PR曲线,yoloV3,map,和,画

    训练指令:./darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 | tee train_yolov3.lo ...

  4. 机器学习:python绘制P-R曲线与ROC曲线

    Python绘制P-R曲线与ROC曲线 查准率与查全率 P-R曲线的绘制 ROC曲线的绘制 查准率与查全率   P-R曲线,就是查准率(precision)与查全率(recall)的曲线,以查准率作为 ...

  5. 机器学习:学习绘制PR曲线

    说明:         "P"为查准率,也称准确率:"R"为查全率,也称召回率. PR曲线是由模型的查准率和查全率为坐标轴形成的曲线,查准率P为纵坐标 查全率R ...

  6. 2020-08-24绘制ROC   PR曲线 核心方法总结 ,计算AUC核心方法

    #1   绘制ROC AUC   PR曲线 #核心方法 roc_curve(y_test, preds)  #  preds为概率形式 #source code import matplotlib.p ...

  7. Python多分类问题pr曲线绘制(含代码)

    研究了三天的多分类pr曲线问题终于在昨天晚上凌晨一点绘制成功了!! 现将所学所感记录一下,一来怕自己会忘可以温故一下,二来希望能给同样有疑惑的铁子们一些启迪! 下图为我画的pr曲线,因为准确度超过了9 ...

  8. 【detectron】绘制loss曲线和pr曲线

    绘制loss曲线 参见博客:detectron训练日志可视化 绘制p-r曲线 在detectron测试完毕后,会在相应的结果输出文件夹中输出每一类的不同precision对应的recall值,保存在x ...

  9. 机器学习基础---pr曲线的绘制

    一.举个例子 总共有8个西瓜,有一个分类器,它的预测情况如下表 设置不同阈值时,将得到不同的P值(Precision,查准率)和R值(Recall,查全率) 二.解释 Precision-查准率-预测 ...

  10. 绘制ROC曲线及P-R曲线

    绘制ROC曲线及P-R曲线 描述 ROC曲线(Receiver Operating Characteristic Curve)以假正率(FPR)为X轴.真正率(TPR)为y轴.曲线越靠左上方说明模型性 ...

最新文章

  1. 苹果iCloud或在今年晚些时候支持游戏中心和苹果地图
  2. HDLBits 系列(12)All about Karnaugh Map
  3. KV数据存储:持久化
  4. 怎么在ASP.NET中写HTML,如何:在 ASP.NET 网页中设置控件的 HTML 属性
  5. 今晚直播丨分布式数据库:从PG-XL到TBASE
  6. Kudu : NonRecoverableException: illegal replication factor 2 (replication factor must be odd)
  7. 在矩池云上Hugging Face使用清华源
  8. 如何用wdcp面板创建网站(转百度经验)
  9. MVC在Web框架中的应用
  10. Zabbix2.4.X_监控SNMP
  11. linux命令hexdump,Linux中hexdump命令起什么作用呢?
  12. 小米安装linux驱动怎么安装教程,小米手机驱动程序怎么安装教程【图文版】
  13. 《MarkDown编辑器的使用技巧(修改录入方式与目录生成)|CSDN编辑器测评》
  14. Jetson开发实战记录(三):Jetson Xavier NX具体开发(Ubuntu18.04系统)
  15. wincc安装信息服务器,常见WinCC安装问题及注意事项
  16. 清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示
  17. arma找不到合适的模型_ARMA模型建模与预测指导
  18. Win10家庭版 傻瓜安装datahub的备忘一则
  19. GitHub项目、代码搜索、使用等技巧
  20. python sympy库实现代数符号运算及表达式推导

热门文章

  1. 【聚类算法】| Kmeans算法的Python实现(以西瓜数据集为例)
  2. LGame-0.3(Android与JavaSE游戏引擎)正式发布,新增SRPG制作模块
  3. Linux 系统字体安装
  4. DELL PERC 系列阵列卡详解
  5. 华为服务器找不到阵列卡_DELL R730服务器配置RAID及安装服务器系统
  6. 交通信息工程 实验四:交通仿真实验(一)
  7. python通过pyserial读写串口
  8. 桥接模式 和 中继模式
  9. qt5 开发及实例(第4版)_张厚粲现代心理与教育统计学第4版配套章节题库
  10. 人工智能 —— 计算智能概述