pytorch yolov3 代码详解_目标检测实战项目『代码实战篇』

本文详细介绍了使用PyTorch实现YOLOv3目标检测的过程,包括数据准备、模型搭建、训练和预测。提供数据标注工具LabelImg的使用指南,以及如何根据XML文件生成TXT数据文件。此外,分享了项目结构、配置文件修改和训练测试的步骤,附带代码解析和开源项目链接。
摘要由CSDN通过智能技术生成

8c582735bbe510259e4bb60311c453e1.png

深度学习的三驾马车:数据、模型、算力。本文将从这三方面,实现 YOLO 目标检测,让自己的数据跑起来

数据

一个深度学习项目最好的初始状态是拥有漂亮的数据,但是一般情况下很难达到这种条件,往往需要根据自己项目的需求寻找相应的数据。对于目标检测项目来说,漂亮的数据应该是按照规范的标注。那么有数据却没有标注怎么办,我们推荐一款开源的标注工具 LabelImg ,有着方便的 GUI 界面,可以方便打开一个文件夹,对相应的图片做标注,标注完成以后,支持 PascalVOC 或者 YOLO 格式导出,非常的方便。

b9d563b4e2d294a5aa8ce085d521177c.png

想尝试一下本项目,苦于没数据怎么办?有数据不想标注,想看一下本项目的效果怎么办?这都不是问题,文末联系我,为你准备了两份数据

模型

目标检测分为 Two-stage 和 One-stage 顾名思义就是两步完成还是一步完成(发展历程就是从 Two-stage 到 One-stage 的过程)

One-stage 和 Two-stage 各有千秋,One-stage 因为没有候选框生成步骤,所以速度会更快,速度更快意味着丧失了部分的精度,Two-stage 因为有候选框的选取过程,所以精度会更高,丧失部分精度,果然是鱼与熊掌不可兼得。

常见的 One-stage 算法有 OverFeat、YOLOv1、YOLOv2、YOLOv3、SSD 和 RetinaNet 等。

本文以 YOLOv3 为主要实践对象,一步一步通过开源的项目,使用 YOLOv3 训练自己的数据(完整的项目会在文末放出)

  • 数据准备

巧妇难为无米之炊,没有数据,再优越的模型也无用武之地。

如果自己有原始的数据,但是没有标注,就可以使用 Labelimg 进行标注,输出的结果是一个 xml 文件。大致的文件结构如下:它包含的信息有图片的高宽通道数各个目标在原始图片的位置以及标签。

123fb4606cb1c5acdf4045b1c894369c.png

如果你已经有了标注的数据,就可以根据 xml 文件生成一个 txt 文件来进行训练,txt 文件的格式如下:第一个值代表类别标签的索引,后面四个值是原始图片上目标折算后的数值,我们就是根据这些数据来训练模型。

07bc66e63d7e29fa3fce09f5d543c23b.png

生成后可以用以下公式对转换前后的数据进行简单的验证,保证数据的准确性(具体的折算过程可以看文末的参考资料):

生成的 txt 内容如下(举例一条):
label <1> <2> <3> <4>

可以用以下公式简单验证一下生成的 txt 和与原始的 xml 文件是否转换正确:其中 label 是类别在 data/custom/classes.names 的索引, <> 代表缩放后的比例系数
    <1>*w = (xmax-xmin)/2 + xmin
    <2>*h = (ymax-ymin)/2 + ymin
    <3> = (xmax-xmin)/w
    <4> = (ymax-ymin)/h

对于如何根据 xml 标注文件生成 txt 数据文件,我们这边有份参考脚本可以帮助你:

阅读 readme.md 中的内容,按照 1、2、3、4 脚本运行,保证你啥问题都没有

│  1_init.py
│  2_createID.py
│  3_trans.py
│  4_to_train_val_txt.py
│  classes.names
│  readme.md
│  train.txt
│  valid.txt
│  
├─images
│      train.jpg
│      
└─labels
        train.txt
  • YOLOv3 模型搭建

我们先来看一下 YOLO 的设计流程,对整个项目的大局有一定的掌控

  1. 配置数据文件
classes= 1  # 目标检测的类别数量,有多少类 就设置多少类
train=data/custom/train.txt  # 训练集的图片名称,放在 train.txt 文件下,每一行是一张图片的名称
valid=data/custom/valid.txt  # 训练集的图片名称
names=data/custom/classes.names  # 每个类别的名字,一行一个
  1. 模型初始化

YOLOv3 使用的是 Darknet53 的结构,是一个全卷积的模型,可以拥抱任何大小的输入,但是必须是 32 的整数倍。Darknet 结果图如下:

a2c02d596760ed0b37e155a7a2392158.png

本文使用的深度学习框架是 Pytorch 项目中读取 Darknet53 模型的方式是通过读取配置文件,格式如下,并把它加载带 Pytorch 定义的模型中

c3410ca6e5674c95a1dee9ace3b2a885.png
  1. 加载预训练模型的参数 :从预训练模型开始训练
  2. 数据加载器配置
  3. 训练模型、保存模型等
  4. 预测
  • 代码配置演练

接下来我们就开始真正配置我们的参数,实现检测自定义的数据,先展示一下整个项目的目录结构

│  detect.py
│  detect_2.py  # 检测代码
│  models.py  # 构建模型
│  readme.md
│  requirements.txt  # 必须的依赖包
│  test.py  # 测试代码
│  train.py  # 训练代码
│      
├─config  # 配置文件
│      coco.data
│      create_custom_model.sh
│      custom.data
│      yolov3-tiny.cfg
│      yolov3.cfg
│      
├─data  # 数据集
│  │  coco.names
│  │  get_coco_dataset.sh
│  │  
│  ├─custom
│  │  │  1_init.py
│  │  │  2_createID.py
│  │  │  3_trans.py
│  │  │  4_to_train_val_txt.py
│  │  │  classes.names
│  │  │  readme.md
│  │  │  train.txt
│  │  │  valid.txt
│  │  │  
│  │  ├─images
│  │  │      train.jpg
│  │  │      
│  │  └─labels
│  │          train.txt
│  │          
│  └─samples
│          dog.jpg
│          
├─utils   # 依赖包
│  │  augmentations.py
│  │  datasets.py
│  │  logger.py
│  │  parse_config.py
│  │  utils.py
│  │  __init__.py
│          
├─weights  # 预训练权重
│      download_weights.sh
  1. 安装依赖
pip3 install -r requirements.txt  # 整个项目需要的依赖包
pip install terminaltables
  1. 修改配置文件
$ cd config/   # Navigate to config dir
# Will create custom model 'yolov3-custom.cfg'
$ bash create_custom_model.sh <num-classes>   #  num-classes 类别数目参数
  1. 修改数据配置文件
classes= 2  # 类别数
train=data/custom/train.txt
valid=data/custom/valid.txt
names=data/custom/classes.names
  1. 训练
# 训练命令
python train.py --model_def config/yolov3-custom.cfg --data_config config/custom.data --pretrained_weights weights/darknet53.conv.74
# 添加其他参数请见 train.py 文件

# 从中断的地方开始训练
python train.py --model_def config/yolov3-custom.cfg --data_config config/custom.data --pretrained_weights checkpoints/yolov3_ckpt_299.pth --epoch 
  1. 测试
# 测试:
python detect_2.py --image_folder data/samples/ --weights_path checkpoints/yolov3_ckpt_25.pth --model_def config/yolov3-custom.cfg --class_path data/custom/classes.names

以上就是整个项目的架构思路,如果你还看不懂,没关系,贴心的我为你们准备了详细的文档说明,并在部分代码处加了详细的解释

本项目已经开源在:https://github.com/FLyingLSJ/Computer_Vision_Project/tree/master/Object_Detection/yolo_demo/PyTorch-YOLOv3-master


训练步骤文档:

8e88e96651458f4508975c30b8c9954d.gif

数据集准备步骤文档

044edfb02db57625f92f53147122f903.gif

以下是该代码在某数据竞赛平台获得的成绩,该比赛是对是否有戴安全帽进行检测,其中有些数据是在教室进行采集的,以下的成绩说明,YOLO 对小目标和密集的目标检测效果并不好

73a270c6af517d7a99892ce88639d40c.png

04daf04febb52ea6e1e20f2c0a9c4659.png

554e8c8ab96bb4f4e9507a1c9fb63480.png

c76c276ff1b94b171895c05591534468.png

其中前 3 名排名如下:

88567b22fe0fdf56b98a3ca4b84d90cd.png

算力

以上说完两驾马车了,还有一驾算力马车,目标检测对于算力的要求相对高点,我用的是下面这台设备,用了快 9 个小时

429ad32f9d76c7989e57c45d21524c1b.png

没有 GPU 算力跑不动怎么办,没关系,联系我,送上免费 GPU 算力

结论

没有数据怎么办?没有模型怎么办?没有算力怎么办?联系我吧~~~

844725cd51a64f8a3998340d847be1ef.png

添加我为好友,一起交流吧

其他相关内容

目标检测实战项目『体验篇』

YOLO 目标检测实战项目『原理篇』

从一个 OpenCV 的 BUG 说起~

参考

  • https://github.com/scutan90/DeepLearning-500-questions/blob/master/
  • https://github.com/tzutalin/labelImg 数据标注
  • https://blog.csdn.net/xiao_lxl/article/details/85342707 VOC 数据格式含义(生成的 txt 数据格式的含义)
  • https://github.com/eriklindernoren/PyTorch-YOLOv3
  • YOLO 博客地址:https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/
  • 机器之心翻译:https://www.jiqizhixin.com/articles/2018-04-23-3
  • YOLO 源码解析:https://zhuanlan.zhihu.com/p/49981816
  • YOLO 解读:https://zhuanlan.zhihu.com/p/76802514
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值