前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >yolo_v3目标检测实战项目| 附两份数据集

yolo_v3目标检测实战项目| 附两份数据集

作者头像
AI算法与图像处理
发布2019-12-02 15:17:58
2K1
发布2019-12-02 15:17:58
举报

本文建议阅读时间 20min

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

数据

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

Labelimg

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

模型

目标检测分为 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 文件。大致的文件结构如下:它包含的信息有图片的高宽通道数各个目标在原始图片的位置以及标签。

xml 文件

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

txt 数据文件

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

代码语言:javascript
复制
生成的 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 脚本运行,保证你啥问题都没有

代码语言:javascript
复制
│  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. 配置数据文件
代码语言:javascript
复制
classes= 1  # 目标检测的类别数量,有多少类 就设置多少类
train=data/custom/train.txt  # 训练集的图片名称,放在 train.txt 文件下,每一行是一张图片的名称
valid=data/custom/valid.txt  # 训练集的图片名称
names=data/custom/classes.names  # 每个类别的名字,一行一个
  1. 模型初始化

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

darknet53 结构图 图片来自互联网,侵删

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

Darknet53 配置文件

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

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

代码语言:javascript
复制
│  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. 安装依赖
代码语言:javascript
复制
pip3 install -r requirements.txt  # 整个项目需要的依赖包
pip install terminaltables

2. 修改配置文件

代码语言:javascript
复制
$ cd config/   # Navigate to config dir
# Will create custom model 'yolov3-custom.cfg'
$ bash create_custom_model.sh <num-classes>   #  num-classes 类别数目参数

3. 修改数据配置文件

代码语言:javascript
复制
classes= 2  # 类别数
train=data/custom/train.txt
valid=data/custom/valid.txt
names=data/custom/classes.names

4. 训练

代码语言:javascript
复制
# 训练命令
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 

5. 测试

代码语言:javascript
复制
# 测试:
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


训练步骤文档:

训练步骤文档


数据集准备步骤文档

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI算法与图像处理 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据
  • 模型
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档