目标检测笔记(十五): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

news/2024/7/10 1:12:22 标签: 目标检测, 笔记, 人工智能

文章目录

  • 一、目标检测介绍
  • 二、YOLOX介绍
  • 三、源码获取
  • 四、环境搭建
    • 4.1 环境检测
  • 五、数据集准备
  • 六、模型训练
  • 七、模型验证
  • 八、模型测试

一、目标检测介绍

目标检测(Object Detection)是计算机视觉领域的一项重要技术,旨在识别图像或视频中的特定目标并确定其位置。通过训练深度学习模型,如卷积神经网络(CNN),可以实现对各种目标的精确检测。常见的目标检测任务包括:人脸检测、行人检测、车辆检测等。目标检测在安防监控、自动驾驶、智能零售等领域具有广泛应用前景。

二、YOLOX介绍

论文链接:YOLOX: Exceeding YOLO Series in 2021

背景:随着物体检测的发展,YOLO系列始终追求实时应用的最佳速度和精度权衡。而且在过去两年中,目标检测学术界的主要进展都集中在无锚检测器 、高级标签分配策略 和端到端(无 NMS)检测器。而YOLOV4和YOLOV5仍然是基于锚的检测器。由于计算资源的限制导致这些优秀的检测器并不能广泛运用。

创新与贡献

  1. Backbone。使用的依旧是CSP的思想,不过YOLOv5中的C3模块被替换成了C2f模块,实现了进一步的轻量化,同时YOLOv8依旧使用了YOLOv5等架构中使用的SPPF模块;
  2. PAN-FPN。毫无疑问YOLOv8依旧使用了PAN的思想,不过通过对比YOLOv5与YOLOv8的结构图可以看到,YOLOv8将YOLOv5中PAN-FPN上采样阶段中的卷积结构删除了,同时也将C3模块替换为了C2f模块
  3. Decoupled-Head。是不是嗅到了不一样的味道?是的,YOLOv8走向了Decoupled-Head;
  4. Anchor-Free。YOLOv8抛弃了以往的Anchor-Base,使用了Anchor-Free的思想;
  5. 损失函数。YOLOv8使用VFL Loss作为分类损失,使用DFL Loss+CIOU Loss作为分类损失;
  6. 样本匹配。YOLOv8抛弃了以往的IOU匹配或者单边比例的分配方式,而是使用了Task-Aligned Assigner匹配方式

三、源码获取

  1. 源码:点击
  2. bubbliiiing的代码:点击

四、环境搭建

我这里的环境安装的方式是根据源码安装的,但是我的代码是下载的bubbliiiing的。
第一步:Install YOLOX from source
cd YOLOX
pip install -v -e . # or python setup.py develop

第二步:安装cuda、torch、torchvision重要的环境。参考这个博客

环境版本
python3.7.11
cuda10.1
torch1.8.0+cu101
torchvision0.9.0+cu101

第三步:安装之后进入到此环境下的代码主目录,在终端运行

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

4.1 环境检测

下载YOLOX-S:点击
在这里插入图片描述
下载之后将模型放在下图位置,并修改predict.py路径
在这里插入图片描述
然后运行predict.py即可,输入图片路径,将得到下面的结果。在这里插入图片描述

五、数据集准备

通过labelImg标注图片得到xml和原图,分别放置在这两个文件夹下(labelImg的使用可查看这个博客)
在这里插入图片描述
这时候就需要将此数据集转换成VOC格式的数据集,方可训练。

通过voc_annotation.py来将数据集进行划分,注意几个地方:

  • annotation_mode为0/1/2的时候的区别,代码里面有备注
  • classes_path:数据集的类别情况,要改为自己的类别
  • 其他地方就是修改路径的问题,改成自己数据集对应的路径

运行后发现在这里插入图片描述

六、模型训练

这时候你会发现在主目录下会得到两个txt文件,一个用于训练一个用于验证。
然后你运行train.py,model_path修改为自己的类别文件路径。然后就可以运行。

python train.py

在这里插入图片描述
训练的同时我们也可以通过tensorboard来查看训练损失和其他指标的图
在这里插入图片描述
在这里插入图片描述

七、模型验证

通过get_map.py来验证模型的准确率、召回率、F1和mAP。(若想要测试集多点,需通过voc_annotation.py来划分数据集的测试集)

python get_map.py

修改的地方

  • map_mode:第一次使用需要设置为0
  • classes_path:为自己的类别文件路径
  • VOCdevkit_path:为自己的数据集路径
  • 还有其他的相关路径的修改
    在这里插入图片描述
    第一次必须使用map_mode = 0才能运行。因为后面有些模式需要结合检测的结果来进行绘制,

由于训练时间问题,我只是简单测试了一下训练效果,没有进行大量的epoch训练,所以效果并不是很好
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

八、模型测试

通过predict.py来对模型测试。

修改的地方

  • mode:可选择图片、视频、fps、热力图、转换成onnx模型等
  • 还有model_path和classes_path也需要改为自己的(和训练情况一样,model_path为训练好的模型文件)
    单张图片
    在这里插入图片描述
    热力图
    在这里插入图片描述

http://www.niftyadmin.cn/n/5017451.html

相关文章

外观模式:简化复杂系统

欢迎来到设计模式系列的第十一篇文章!在之前的文章中,我们已经学习了许多常用的设计模式,今天我们将继续介绍另一个非常有用的设计模式——外观模式。 外观模式简介 外观模式是一种结构型设计模式,它提供了一个统一的接口&#…

Linux常见进程类别

目录 常见进程类别 守护进程&精灵进程 任务管理 进程组 作业 作业 | 进程组 会话 w命令 守护进程 守护进程的创建 setsid()函数 daemon()函数 模拟实现daemon函数 前台进程 | 后台进程 僵尸进程 | 孤儿进程 僵尸进程的一些细节 守护进程 | 后台进程 守护…

13-RocketMQ主从同步(HA实现)源码原理

slave每次接收到master发过来的一批commitlog数据时,会看master传过来的这段commitlog的起始端,对应的全局物理偏移量,和slave本地存储的批commitlog数据的最大物理偏移量,是否相等 如果相等,也说明master端没有给sla…

13 Python使用Json

概述 在上一节,我们介绍了如何在Python中使用xml,包括:SAX、DOM、ElementTree等内容。在这一节,我们将介绍如何在Python中使用Json。Json的英文全称为JavaScript Object Notation,中文为JavaScript对象表示法&#xff…

一种高效且节约内存的聚合数据结构的实现

一种高效且节约内存的聚合数据结构的实现 在特定的场景中,特殊定制数据结构能够得到更加好的性能且更节约内存。 聚合函数GroupArray的问题 GroupArray聚合函数是将分组内容组成一个个数组,例如下面的例子: SELECT groupArray(concat(ABC…

Android前端音视频数据接入GB28181平台意义

技术背景 在华脉智联研发Android平台GB28181前端音视频接入模块之前,业内听到最多的是,如何用Android端在没有国标摄像头设备的前提下,模拟GB28181的信令和媒体流交互流程,实现GB28181整体方案的测试。 Android端真的没有必要做…

联通面试题

一、GC 1.1、目标 GC的主要作用是自动识别和释放不再使用的对象,回收其所占用的内存,以防止内存泄漏和内存溢出的问题。 1.2、如何实现 1.2.1、标记阶段 GC从根对象(如线程栈中的引用、静态变量等)开始,通过可达性…

手写Spring:第17章-通过三级缓存解决循环依赖

文章目录 一、目标:通过三级缓存解决循环依赖二、设计:通过三级缓存解决循环依赖2.1 通过三级缓存解决循环依赖2.2 尝试使用一级缓存解决循环依赖 三、实现:通过三级缓存解决循环依赖3.1 工程结构3.2 通过三级缓存解决循环依赖类图3.3 设置三…