Yolov3计算准确率、误报率、漏检率等

2023-11-09

思想很简单,将标注的yolo数据转下格式,转为[类别,xmin,ymin,xmax,ymax]

转换valid后的信息,两个信息进行对比 完事

 

具体的,在终端执行:

./darknet detector valid cfg/voc.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights

tip:在后面加入-thresh 0.25可以设置显示置信度的大小

result文件夹下会生成以类别命名的txt文档,如下,在这里我一共就三个类别:smoke、red、white

comp4_det_test_smoke.txt

comp4_det_test_red.txt

comp4_det_test_white.txt

解析几个文件中的信息,如comp4_det_test_smoke.txt里面保存的是所有图片中识别为smoke的信息[文件名、置信度、xmin,ymin,xmax,ymax]。

运行如下代码:

import os

# txt_file为配置文件.data中的valid
txt_file = '/home/share/liubo/darknet/yanhuo/eval.txt'
f = open(txt_file)
lines = f.readlines()
for line in lines:
    line = line.split('/')[-1][0:-5]
    # test_out_file 为转换后保存的结果地址
    test_out_file = '/home/share/liubo/darknet-yolov3/results/test_acc_yanhuo'
    # 下面3个with需要自己的修改,修改成自己对应的类别
    with open(os.path.join(test_out_file , line + '.txt'), "a") as new_f:
        f1 = open('/home/share/liubo/darknet-yolov3/results/comp4_det_test_smoke.txt', 'r')
        f1_lines = f1.readlines()
        for f1_line in f1_lines:
            f1_line = f1_line.split()
            if line == f1_line[0]:
                new_f.write("%s %s %s %s %s %s\n" % ('smoke', f1_line[1], f1_line[2], f1_line[3], f1_line[4], f1_line[5]))
    with open(os.path.join(test_out_file , line + '.txt'), "a") as new_f:
        f1 = open('/home/share/liubo/darknet-yolov3/results/comp4_det_test_white.txt', 'r')
        f1_lines = f1.readlines()
        for f1_line in f1_lines:
            f1_line = f1_line.split()
            # print(line.split('.')[0] + ' ' + f1_line[0])
            if line == f1_line[0]:
                new_f.write("%s %s %s %s %s %s\n" % ('white', f1_line[1], f1_line[2], f1_line[3], f1_line[4], f1_line[5]))
    with open(os.path.join(test_out_file , line + '.txt'), "a") as new_f:
        f1 = open('/home/share/liubo/darknet-yolov3/results/comp4_det_test_red.txt', 'r')
        f1_lines = f1.readlines()
        for f1_line in f1_lines:
            f1_line = f1_line.split()
            if line == f1_line[0]:
                new_f.write("%s %s %s %s %s %s\n" % ('red', f1_line[1], f1_line[2], f1_line[3], f1_line[4], f1_line[5]))

运行代码后,效果如下:

                                转换前                                                                                  转换后

此时out_file中保存了所有的检测信息,接下来对yolo数据格式进行转换

执行以下代码:

import os
from PIL import Image
import numpy as np
# label_img为数据集的labels地址,img_path为数据集images的地址
label_img = '/home/share/liubo/darknet/yanhuo/labels/'
img_path = '/home/share/liubo/darknet/yanhuo/images/'
classes = {
    0:'smoke',
    1:'white',
    2:'red'
}
for line in lines:
    line = line.split('/')[-1][0:-5] + '.txt'
    txt = label_img + line
    img = np.array(Image.open(img_path + line.split('/')[-1][0:-4] + '.jpg'))
    sh, sw = img.shape[0], img.shape[1]
    # gt_out_file为转换后的地址
    gt_out_file = '/home/share/liubo/darknet-yolov3/results/gt_yanhuo'
    with open(os.path.join(gt_out_file , line ), "a") as new_f:
        f1 = open(txt)
        f1_lines = f1.readlines()
        for f1_line in f1_lines:
            f1_line = f1_line.split()
            x = float(f1_line[1]) * sw
            y = float(f1_line[2]) * sh
            w = float(f1_line[3]) * sw
            h = float(f1_line[4]) * sh
            xmin = x+1-w/2
            ymin = y+1-h/2
            xmax = x+1+w/2
            ymax = y+1+h/2
            new_f.write("%s %s %s %s %s\n" % (classes[int(f1_line[0])], xmin ,ymin,xmax,ymax))

此时已经保存了所有检测结果和转换后的结果,接下来对应的txt进行比较计算。

import os


def compute_IOU(rec1, rec2):
    """
    计算两个矩形框的交并比。
    :param rec1: (x0,y0,x1,y1)      (x0,y0)代表矩形左上的顶点,(x1,y1)代表矩形右下的顶点。下同。
    :param rec2: (x0,y0,x1,y1)
    :return: 交并比IOU.
    """
    left_column_max = max(rec1[0], rec2[0])
    right_column_min = min(rec1[2], rec2[2])
    up_row_max = max(rec1[1], rec2[1])
    down_row_min = min(rec1[3], rec2[3])
    # 两矩形无相交区域的情况
    if left_column_max >= right_column_min or down_row_min <= up_row_max:
        return 0
    # 两矩形有相交区域的情况
    else:
        S1 = (rec1[2] - rec1[0]) * (rec1[3] - rec1[1])
        S2 = (rec2[2] - rec2[0]) * (rec2[3] - rec2[1])
        S_cross = (down_row_min - up_row_max) * (right_column_min - left_column_max)
        return S_cross / (S1 + S2 - S_cross)

# gt为yolo数据转换后的地址
gt = '/home/share/liubo/darknet-yolov3/results/gt_yanhuo/'
# test为检测结果转换后的地址
test = '/home/share/liubo/darknet-yolov3/results/test_acc_yanhuo/'
# count_gt为标注的所有数据框
count_gt = {

}
# count_test为检测的所有数据框
count_test = {

}
# count_yes_test为检测正确的数据框
count_yes_test = {

}
# count_no_test为检测错误的数据框
count_no_test = {

}
# 计数
for gt_ in os.listdir(gt):
    txt = gt + gt_
    f = open(txt)
    lines = f.readlines()
    for line in lines:
        line = line.split()
        name = line[0]
        if name not in count_gt:
            count_gt[name] = 0
        count_gt[name] += 1
for test_ in os.listdir(test):
    txt = test + test_
    f = open(txt)
    lines = f.readlines()
    for line in lines:
        line = line.split()
        name = line[0]
        if name not in count_test:
            count_test[name] = 0
        count_test[name] += 1
# 下面主要思想:遍历test结果,再遍历对应gt的结果,如果两个框的iou大于一定的阙址并且类别相同,视为正确
for test_ in os.listdir(test):
    f_test_txt = test + test_
    f_test = open(f_test_txt)
    f_test_lines = f_test.readlines()
    for f_test_line in f_test_lines:
        f_test_line = f_test_line.split()
        f_gt_txt = gt + test_
        f_gt = open(f_gt_txt)
        f_gt_lines = f_gt.readlines()
        flag = 1
        for f_gt_line in f_gt_lines:
            f_gt_line = f_gt_line.split()
            IOU = compute_IOU([float(f_gt_line[1]), float(f_gt_line[2]), float(f_gt_line[3]), float(f_gt_line[4])],
                              [float(f_test_line[2]), float(f_test_line[3]), float(f_test_line[4]), float(f_test_line[5])])
            if f_gt_line[0] == f_test_line[0] and IOU >= 0.5 and float(f_test_line[1]) >= 0.3:
                flag = 0
                if f_test_line[0] not in count_yes_test:
                    count_yes_test[f_test_line[0]] = 0
                count_yes_test[f_test_line[0]] += 1

        if flag == 1:
            if f_test_line[0] not in count_no_test:
                count_no_test[f_test_line[0]] = 0
            count_no_test[f_test_line[0]] += 1
# 有以下4个结果,就可以计算相关指标了
print(count_gt)
print(count_test)
print(count_yes_test)
print(count_no_test)

 

以上就是Yolov3计算准确率、误报率、漏检率等的全过程

写了好久之后才写的博客,有什么理解错误或者代码问题请及时交流 感谢~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yolov3计算准确率、误报率、漏检率等 的相关文章

随机推荐

  • 基于Python机器学习算法小分子药性预测(岭回归+随机森林回归+极端森林回归+加权平均融合模型)

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 Python 环境 配置工具包 模块实现 1 数据预处理 2 创建模型并编译 3 模型训练 系统测试 工程源代码下载 其它资料下载 前言 麻省理工科技评论 于2020年发布了 十大
  • Kafka如何获取topic最近n条消息

    问题来源 项目运行中我们经常需要诊断个个环节是否正确 其中到kafka就需要查看最新的消息到达kafka没有 达到的内容是什么 这就需要查看kafka指定topic的最近的n条消息 将kakfa消息全部打印出来非常耗时而且不必要 当然我们可
  • mpvue vuex持久化缓存

    mpvue vuex持久化缓存 使用vuex persistedstate插件 npm install vuex persistedstate save 在store index js中添加plugins export default ne
  • 正则表达式/i,/g,/ig,/gi,/m

    正则表达式中 i g ig gi m的区别和含义 i 忽略大小写 g 全文查找出现的所有匹配字符 m 多行查找 gi 全文查找 忽略大小写 ig 全文查找 忽略大小写 这些是模式修正符 解说正则表达式模式中使用的修正符i 如果设定此修正符
  • 09黑马笔记之栈的应用_中缀表达式转后缀表达式

    09黑马笔记之栈的应用 中缀表达式转后缀表达式 1 前提 1 数字 直接输出 2 左括号 直接进栈 优先级默认最低 3 右括号 将栈顶符号输出 直到匹配到左括号 4 运算符 1 若一开始没有可比较直接进栈 2 若栈顶元素优先级低 进栈 3
  • 蓝桥杯客观题 单片机知识点总结

    1 IAP15f2k60S2含义 IAP15 单片机型号 F 单片机工作电压5 5V 4 2V 2k 2048字节的SRAM 最大主频35MH 60 60KB flash ROM程序存储器 S2 含有2个串口 KB k 2 10Byte 1
  • chatgpt赋能python:Python操作SEO:从抓取网页到数据分析

    Python操作SEO 从抓取网页到数据分析 在当今数字化时代 搜索引擎优化已经成为了每家企业的必修课 然而 SEO涉及到众多技术 其中爬虫抓取和数据处理是其中关键环节 而Python语言正是在这两个方面表现出了非常强大的优势 1 Pyth
  • 滑动奇异频谱分析:数据驱动的非平稳信号分解工具(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 奇异频谱分析
  • IP地址与mac地址是什么?dhcp与arp又是什么?

    计算机网络中 数据的通信就类比写信 两个人写信 需要知道家庭住址以及收件人信息 1 IP地址与mac地址 IP地址就是家庭住址 mac地址就是收件人 例如 一个网卡 硬件设备 就是一个公寓 一个网卡有一个mac地址 出厂时已写入 全球唯一地
  • react+umi3配置代理问题

    前端配置项目代理 一般是为了解决浏览器跨域策略 在umi中有非常方便的方式可以供我们快速配置代理 在我的项目中配置代理也遇到了一个坑点 特此记录一下 环境 react 17 0 0 umi 3 5 0 开始 umi项目中 在项目根目录下创建
  • sonarqube汉化

    参考文档SonarQube基础 中文设定设定方法 知行合一 止于至善 CSDN博客 sonarqube设置中文 用方法一解决
  • 递归实现逆序输出整数

    在这里插入代码片 本题目要求读入1个正整数n 然后编写递归函数reverse int n 实现将该正整数逆序输出 输入格式 输入在一行中给出1个正整数n 输出格式 对每一组输入 在一行中输出n的逆序数 输入样例 12345 样例 54321
  • Java中的的类和对象

    类的概念 类是对生活中具有相同属性和行为的事物的抽象 它是一个大概的范围 类包含属性和行为 属性和行为在程序中也叫做成员变量和成员方法 对象的概念 是能够看得到的具备行为和属性的真实存在的实体 类和对象的关系 类是对象的抽象的范围表达 对象
  • HTML5中把一首古诗变大缩小和变颜色并用数据储存起来

    效果图如下 代码如下
  • 可中断睡眠 sleep

    可中断睡眠 可中断睡眠的执行情况 进程开始时处于可中断睡眠状态 那么如果进程接收到信号后 进程将被唤醒而不在阻塞 当执行完信号处理函数后 就不再睡眠了 直接向下执行代码 sleep 函数 unsigned int sleep unsigne
  • bugku各种绕过

    题目要求uname passwd 但是他们的SHA1值要相同 且id值为margin 利用PHP的sha1漏洞 当参数为数组时返回false 判断成立
  • 嵌入式入门基础知识有哪些?

    嵌入式系统是指在特定应用领域内为满足特定要求而设计的计算机系统 通常被嵌入到设备中 具有实时性 可靠性 低功耗等特点 嵌入式系统应用广泛 例如 智能家居 智能手表 汽车控制系统 医疗设备等 在本篇博客中 我们将讨论嵌入式入门基础知识 包括嵌
  • 狂神说Mybatis笔记(全网最全)

    Mybatis 环境说明 jdk 8 MySQL 5 7 19 maven 3 6 0 IDEA 学习前需要掌握 JDBC MySQL Java 基础 Maven Junit 1 Mybatis简介 1 1 什么是MyBatis MyBat
  • 认识区块链,认知区块链— —数据上链

    上周末参加一次长沙本地胡子互联网俱乐部举办的区块链分享会 颇受启发 同时感谢俱乐部提供的这个交流平台 祝好 好吧 还是先把前些天对区块链的一点理解简单整理下 再回顾下上周末的参会纪要比较好 下篇给大家分享出来 个人区块链思考第一篇 认识区块
  • Yolov3计算准确率、误报率、漏检率等

    思想很简单 将标注的yolo数据转下格式 转为 类别 xmin ymin xmax ymax 转换valid后的信息 两个信息进行对比 完事 具体的 在终端执行 darknet detector valid cfg voc data cfg