【目标检测论文必备】通俗易懂地讲解用绿色、蓝色、红色框可视化描述YOLO模型权重对于单个图片的训练效果(TP、FP、FN)

news2024/11/15 13:55:12

可视化步骤

  • 一、生成自定义权重对图片的预测类别坐标信息
  • 二、创建需要预测的文件夹
  • 三、可视化运行

一、生成自定义权重对图片的预测类别坐标信息

新建脚本文件/path/to/your/ultralytics/savetxt.py放入对应参数运行会得到一个个独立的/path/to/your/runs/detect/output/output1/labels坐标信息文件夹

请注意这是使用Ultralytics封装的脚本文件

from ultralytics import YOLO  
model = YOLO("/path/to/your/weights/best.pt")
model.predict(source="/path/to/your/test/image.jpg",conf=0.45, save=True,save_conf=True,save_txt=True,name='output') 
  • source后为要预测的图片数据集的的路径
  • save=True为保存预测结果
  • save_conf=True为保存坐标信息
  • conf=0.45为目标置信区间是0.45
  • save_txt=True为保存txt结果,但是当图片中预测不到任何物体时,不产生txt文件

二、创建需要预测的文件夹

注意一定要是文件夹(directory)
且文件夹内图片数量和名称全部一一对应

  • 被预测的图片文件夹:/path/to/your/directory/images
  • 真实类别坐标信息文件夹:/path/to/your/directory/labels
  • 预测类别坐标信息文件夹:/path/to/your/directory/predict_labels

将挑选的被预测图片放入第一个文件夹
将步骤一生成的类别坐标信息放入第二个文件夹
将被预测图片对应真实的类别坐标信息放入第三个文件

...
├── directory
│   ├── images
│   │   ├── 0000087_01140_d_0000004.jpg
│   │   ├── ...
│   ├── labels
│   │   ├── 0000087_01140_d_0000004.txt
│   │   ├── ...
│   ├── predict_labels
│   │   ├── 0000087_01140_d_0000004.txt
│   │   ├── ...

三、可视化运行

新建/path/to/your/detect.py填写下述代码
再建立一个可视化结果输出文件夹/path/to/your/vis/

import os
import cv2
import tqdm
import shutil
import numpy as np
 
def xywh2xyxy(box):
    box[:, 0] = box[:, 0] - box[:, 2] / 2
    box[:, 1] = box[:, 1] - box[:, 3] / 2
    box[:, 2] = box[:, 0] + box[:, 2]
    box[:, 3] = box[:, 1] + box[:, 3]
    return box
 
def iou(box1, box2):
    x11, y11, x12, y12 = np.split(box1, 4, axis=1)
    x21, y21, x22, y22 = np.split(box2, 4, axis=1)
 
    xa = np.maximum(x11, np.transpose(x21))
    xb = np.minimum(x12, np.transpose(x22))
    ya = np.maximum(y11, np.transpose(y21))
    yb = np.minimum(y12, np.transpose(y22))
 
    area_inter = np.maximum(0, (xb - xa + 1)) * np.maximum(0, (yb - ya + 1))
 
    area_1 = (x12 - x11 + 1) * (y12 - y11 + 1)
    area_2 = (x22 - x21 + 1) * (y22 - y21 + 1)
    area_union = area_1 + np.transpose(area_2) - area_inter
 
    iou = area_inter / area_union
    return iou
 
def draw_box(img, box, color):
    cv2.rectangle(img, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])), color, thickness=2) 
    # thickness设置检测框粗细
    return img
 
if __name__ == '__main__':
    postfixes = ['jpg', 'JPG']  # 定义要处理的后缀列表
    img_path = '/path/to/your/directory/images/0000087_01140_d_0000004.jpg'
    label_path = '/path/to/your/directory/labels/0000087_01140_d_0000004.txt'
    predict_path = '/path/to/your/directory/predict_labels/0000087_01140_d_0000004.txt'
    save_path = '/path/to/your/vis/' # 可视化结果保存的文件夹目录
    classes = ['pedestrian', 'people', 'bicycle', 'car'] # 你的自定义数据集类别
    detect_color, missing_color, error_color  = (0, 255, 0), (0, 0, 255), (255, 0, 0)#(g,b,r)# 不同检测结果下检测框颜色设置
    iou_threshold = 0.45 # 与步骤一的conf保持一致
    
    if os.path.exists(save_path):
        shutil.rmtree(save_path)
    os.makedirs(save_path, exist_ok=True)
 
    all_right_num, all_missing_num, all_error_num = 0, 0, 0
    with open('result.txt', 'w') as f_w:
        for filename in tqdm.tqdm(os.listdir(img_path)):
            postfix = filename.split('.')[-1]  # 获取文件名后缀
            if postfix.lower() in postfixes:  # 判断后缀是否在指定列表中
                image = cv2.imread(os.path.join(img_path, filename))
                if image is None:
                    print(f'image:{os.path.join(img_path, filename)} not found.', file=f_w)
                    continue
                h, w = image.shape[:2]
 
                path = filename[:-4]  # 去除文件后缀
 
                try:
                    with open(f'{predict_path}/{path}.txt') as f:
                        pred = np.array(list(map(lambda x:np.array(x.strip().split(), dtype=np.float32), f.readlines())))
                        pred[:, 1:5] = xywh2xyxy(pred[:, 1:5])
                        pred[:, [1, 3]] *= w
                        pred[:, [2, 4]] *= h
                        pred = list(pred)
                except:
                    pred = []
 
                try:
                    with open(f'{label_path}/{path}.txt') as f:
                        label = np.array(list(map(lambda x:np.array(x.strip().split(), dtype=np.float32), f.readlines())))
                        label[:, 1:] = xywh2xyxy(label[:, 1:])
                        label[:, [1, 3]] *= w
                        label[:, [2, 4]] *= h
                except:
                    print(f'label path:{label_path}/{path}.txt (not found or no target).', file=f_w)
 
                right_num, missing_num, error_num = 0, 0, 0
                label_id, pred_id = list(range(label.shape[0])), [] if len(pred) == 0 else list(range(len(pred)))
                for i in range(label.shape[0]):
                    if len(pred) == 0: break
                    ious = iou(label[i:i+1, 1:], np.array(pred)[:, 1:5])[0]
                    ious_argsort = ious.argsort()[::-1]
                    missing = True
                    for j in ious_argsort:
                        if ious[j] < iou_threshold: break
                        if label[i, 0] == pred[j][0]:
                            image = draw_box(image, pred[j][1:5], detect_color)
                            pred.pop(j)
                            missing = False
                            right_num += 1
                            break
 
                    if missing:
                        image = draw_box(image, label[i][1:5], missing_color)
                        missing_num += 1
 
                if len(pred):
                    for j in range(len(pred)):
                        image = draw_box(image, pred[j][1:5], error_color)
                        error_num += 1
 
                all_right_num, all_missing_num, all_error_num = all_right_num + right_num, all_missing_num + missing_num, all_error_num + error_num
                cv2.imwrite(f'{save_path}/{path}.{postfix}', image)
                print(f'name:{path} right:{right_num} missing:{missing_num} error:{error_num}', file=f_w)
        print(f'all_result: right:{all_right_num} missing:{all_missing_num} error:{all_error_num}', file=f_w)

总结起来需要自定义修改的地方如下

def draw_box(img, box, color):
    cv2.rectangle(img, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])), color, thickness=2)
    # thickness设置检测框粗细
    return img
    
postfixes = ['jpg', 'JPG']  # 定义要处理的后缀列表
img_path = '/path/to/your/directory/images/0000087_01140_d_0000004.jpg'
label_path = '/path/to/your/directory/labels/0000087_01140_d_0000004.txt'
predict_path = '/path/to/your/directory/predict_labels/0000087_01140_d_0000004.txt'
save_path = '/path/to/your/vis/' # 可视化结果保存的文件夹目录
classes = ['pedestrian', 'people', 'bicycle', 'car'] # 你的自定义数据集类别
detect_color, missing_color, error_color  = (0, 255, 0), (0, 0, 255), (255, 0, 0)#(g,b,r)# 不同检测结果下检测框颜色设置
iou_threshold = 0.45 # 与步骤一的conf保持一致

不同颜色检测框代表的模型权重对于预测图片的检测情况

  • 绿色:真正例(TP),指检测到的目标与实际目标之间的匹配,这意味着检测到的目标在位置和类别上都与实际目标匹配,即正确检出;
  • 蓝色:假正例(FP),指模型错误地将负例(非目标)样本预测为正例(目标),即误检;
  • 红色:假负例(FN),指模型未能检测到实际存在的目标,即漏检。

最终生成的图片位于:/path/to/your/vis/0000087_01140_d_0000004.jpg

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2150597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动技术开发:简单计算器界面

1 实验名称 简单计算器界面 2实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法&#xff0c;以及事件监听处理的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:and…

2024年港澳台华侨生联考分数线继续更新来啦

导读 在最近的一系列分享中&#xff0c;我们和大家一同分享了2024年港澳台华侨生联考的分数线。今天我们继续和大家一起分享一些2024年港澳台联考的高校录取分数线吧&#xff01; 首都师范大学 首都师范大学和首都医科大学作为被低估的两所高校&#xff0c;这两年的分数线也是…

web基础—dvwa靶场(十)XSS

XSS(DOM) 跨站点脚本&#xff08;XSS&#xff09;攻击是一种注入攻击&#xff0c;恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;发送给其他最终用户时&#xff0c;就会发生 XSS 攻击。允许这些攻击成…

Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW

GUFW是UFW的图形化前端&#xff0c;可以通过以下命令安装&#xff1a; sudo apt install gufw安装成功后&#xff0c;可以通过应用程序菜单启动GUFW&#xff0c;在图形界面中&#xff0c;可以方便地添加、修改和删除规则&#xff0c;查看状态和日志。

【数据结构取经之路】图解红黑树

目录 前言 红黑树的概念 红黑树的性质 红黑树结点的定义 左右旋动图 红黑树的插入分析 红黑树的插入代码 红黑树与AVL-tree比较 红黑树的应用场景 前言 AVL-tree之外&#xff0c;另一个颇具历史且被广泛使用的平衡二叉搜索树是红黑树(RB-tree)&#xff0c;这名字听起来…

码头童话,“丈量”行业数智化转型

作者 | 曾响铃 文 | 响铃说 一箱车厘子从地球正对的另一边远渡重洋来到中国&#xff0c;而一旦到达&#xff0c;5个小时内它就能变成北京、天津、河北、河南等区域老百姓果盘里的美味。 这一幕&#xff0c;来自央视联合华为制作发布的《新智中国说-谈智一会间》第一期“码头…

PHP邮件发送教程:如何用PHP发送电子邮件?

php邮件怎么实现发送电子邮件&#xff1f;php怎么给邮箱发邮件&#xff1f; PHP作为一种广泛使用的服务器端脚本语言&#xff0c;提供了多种方法来实现电子邮件的发送。AokSend将详细介绍如何使用PHP邮件功能来发送电子邮件&#xff0c;帮助开发者轻松实现这一重要功能。 PHP…

30道常见的软件测试面试题(含答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范的 1&#xff09;任务测试明确&#xff0c;需求不会频繁变动 2&#xff09;项…

vulnhub靶场 DC-3

地址: https://download.vulnhub.com/dc/DC-3-2.zip 开启NAT模式 namp只扫到了一个端口 打开网页有一个登录的页面 目录扫描一下,可以找到一个 后台登录界面 看一下指纹信息 joomla cms 网上搜一下可以发现存在一个JoomScan工具 在kali上面安装一下 apt install joomscan …

4. 密码协议

4. 密码协议 (1) 协议的基本概念 协议是一种在两个或多个参与者之间进行通信的规范,它定义了参与者之间的交互方式、消息格式和通信过程。协议的目的是确保通信的可靠性和安全性,防止信息被篡改、伪造或泄露。 (2) 密码协议分类及基本密码协议 密码协议是用于加密和解密数…

【Python报错已解决】ModuleNotFoundError: No module named ‘tensorflow‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

浅谈“流量回放”

一、流量回放定义 “流量回放”通常指的是将之前记录的网络请求和响应数据重新发送到系统中&#xff0c;以模拟真实用户的操作。这种技术主要用于测试和调试目的&#xff0c;帮助开发人员和测试人员更好地理解系统在特定条件下的行为。 二、流量回放的技术原理&#xff1a; 数…

前端动画库大比拼:为何选择Velocity.js

前端动画库大比拼&#xff1a;为何选择Velocity.js 前言 在现代网页设计中&#xff0c;动画效果是提升用户体验的重要手段。 Velocity.js: 一个与 jQuery 动画 API 兼容的动画引擎&#xff0c;以其卓越的性能和丰富的功能&#xff0c;成为了开发者的好工具。 本文将详细介绍…

大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍

文章目录 阿里云Flink MySQL连接器介绍 一、特色功能 二、​​​​​​​语法结构 三、​​​​​​​​​​​​​​WITH参数 阿里云Flink MySQL连接器介绍 阿里云提供了MySQL连接器&#xff0c;其作为源表时&#xff0c;扮演的就是flink cdc的角色。 一、特色功能 MySQ…

【Qt笔记】QToolBox控件详解

目录 引言 一、QToolBox的基本功能 1.1 分页布局 1.2 可点击标签 1.3 图标支持 1.4 信号与槽 二、 QToolBox的属性设置 2.1 设置指定索引位置可用性 2.2 设置指定索引位置图标 2.3 设置标题 2.4 设置提示信息 2.5 获取信息 三、QToolBox的常用API 3.1 构造函数…

前端vue-单选按钮的实现

要把name“sex”和value"男" 和 要把name“sex”和value"女"写上&#xff0c;然后在各自的标签内部写上v-model绑定属性。data中定义v-model的绑定值&#xff0c;后面的值是默认选中的男或者女性。

Google Play金融类应用上了又被下,怎么搞定设备短信权限问题?

不久前谷歌对金融类产品应用更新了政策要求&#xff0c;即8月31日起新注册的开发者账号必须得注册为企业账号才可以上架金融类产品应用&#xff0c;这对原本就是用企业号的开发团队或公司没什么影响&#xff0c;但如果用的是个人号得做点准备了。 可以看出&#xff0c;谷歌对金…

剑灵服务端源码(c#版本+数据库+配套客户端+服务端)

剑灵服务端源码&#xff0c;喜欢的下载研究研究。谁技术牛B的话&#xff0c;能把最新版本的客户端接上&#xff0c;就好了。 剑灵服务端源码&#xff08;c#版本数据库配套客户端服务端&#xff09; 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;【源码】剑灵服务端源码…

利士策分享,自我和解:通往赚钱与内心富足的和谐之道

利士策分享&#xff0c;自我和解&#xff1a;通往赚钱与内心富足的和谐之道 在这个快节奏、高压力的时代&#xff0c;我们往往在追求物质财富的同时&#xff0c;忽略了内心世界的和谐与平衡。 赚钱&#xff0c;作为现代生活中不可或缺的一部分&#xff0c;它不仅仅是生存的手段…

YOLOv8改进 - 注意力篇 - 引入ECA注意力机制

一、本文介绍 作为入门性第一篇&#xff0c;这里介绍了ECA注意力在YOLOv8中的使用。包含ECA原理分析&#xff0c;ECA的代码、ECA的使用方法、以及添加以后的yaml文件及运行记录。 二、ECA原理分析 ECA官方论文地址&#xff1a;ECA文章 ECA的pytorch版代码&#xff1a;ECA的…