日志

yolov5实战之皮卡丘检测

 来源    2021-01-14    0  

前言

从接触深度学习开始一直都做的是人脸识别,基本上也一直都在用mxnet. 记得之前在刚接触的时候看到博客中写到,深度学习分三个层次,第一个层次是分类,第二个层次是检测,第三个层次是分割。人脸识别算是分类问题,也就是一直在第一个层次···一直都想有机会了解下第二个层次,奈何精力有限,工作中也没有实际的项目需要。最近正好有个不急的检测项目,趁此机会入门检测吧。工作中听同事提到yolov5效果不错,而且文档指导也比较丰富,因此选择从此入手,顺便也熟悉下pytorch。本文就以训练一个简单的皮卡丘检测作为入门吧,也激发下对检测的学习兴趣,暂时不涉及网络,anchor等细节的理解,只以训练完为目标。

环境准备

安装torch这些就不说了,本次训练基于yolov5官方项目:
https://github.com/ultralytics/yolov5
clone后,pip install -r requirements.txt安装各项依赖
基本的目录结构如下:
data: 训练数据和数据配置文件以及训练配置
models: 模型配置文件
utils: 数据读取、nms等各种训练测试中用到的脚本
weight:
train.py: 训练脚本
test.py:测试脚本
detect.py: 运行脚本

数据集准备

https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
根据官方指导,按需要的格式准备数据集:

  1. 一个图片文件对应一个同名的.txt label文件
  2. label文件中每一行表示一个目标,格式为:class x_center y_center box_width box_height, 其中数值都是归一化的。类别从0开始
  3. 按类似目录方式防止数据,yolov5通过将图片路径中最后一个images换成labels去寻找对应的标签
coco/images/000000109622.jpg  # image
coco/labels/000000109622.txt  # label

本文中用的数据来源于 目标检测数据集(皮卡丘) 中,但原文是mxnet用的rec格式,因此需要转换成yolo格式。我已经转好了:
链接: 百度网盘数据集 提取码: rek1
下载后解压即可得到符合格式要求的数据。
数据示例:

训练前的配置

修改或新建dataset.yaml

在data目录下,我们可以看到一个coco.yaml,内容如下:

# COCO 2017 dataset http://cocodataset.org - first 128 training images
# Train command: python train.py --data coco128.yaml
# Default dataset location is next to /yolov5:
#   /parent_folder
#     /coco128
#     /yolov5


# download command/URL (optional)
# download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ./data/coco128/images/train2017/  # 训练集图片路径
val: ./data/coco128/images/train2017/  # 验证集图片路径

# number of classes,类别数
nc: 80

# class names,类别名
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
        'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
        'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
        'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
        'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
        'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
        'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
        'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
        'hair drier', 'toothbrush']

仿照这个格式,建立皮卡丘数据集的配置文件:

# COCO 2017 dataset http://cocodataset.org - first 128 training images
# Train command: python train.py --data coco128.yaml
# Default dataset location is next to /yolov5:
#   /parent_folder
#     /coco128
#     /yolov5


# download command/URL (optional)
# download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ./data/pikachu/images/train/  # 128 images
val: ./data/pikachu/images/val/  # 128 images

# number of classes
nc: 1

# class names
names: ['pikachu']

训练参数配置

训练参数配置在data/hyp.finetune.yaml和hyp.scratch.yaml中,前者是finetune用的,后者是从头训练的。这次我们直接用hyp.finetune.yaml,先不做修改。

模型配置

模型配置在models/yolov5s.yaml中。目前也不做修改。

开始训练

训练使用train.py脚本,主要参数有:

--weights 预训练权重,“”表示从头训  
--cfg 模型配置文件路径  
--data 数据配置文件路径  
--hyp 训练参数配置文件路径  
--epochs 训练的epoch数 
--batch-size 
--img-size 网络的输入大小  
--noautoanchor 是否自动计算anchor  
--device 设备号  
--workers dataloader线程数

还有很多其他参数,不过暂时用不上就先不管了,执行以下命令可开始训练,脚本会自动去下载yolov5s的预训练权重进行训练。

python train.py --weights yolov5.pt --data data/pikachu.yaml --hyp data/hyp.finetune.yaml --epochs 40 --img-size 320 --device 0 --batch-size 512

可视化

yolov5里面有两种可视化方式,一种是tensorboard, 一种是wandb。
其中wandb有两种使用方式,一种是到https://wandb.ai/home注册一个账号,在线使用。注册后新建项目,名字叫yolov5,然后本地安装配置wandb, 按提示输入必要的信息(API Key):

pip install wandb  
wandb login

那么训练时就可以在自己的项目中看到如下画面,还是挺不错的,功能挺丰富:

不过这个网站挺卡的,好在wandb也有本地使用方式。

安装docker后
wandb local

参考:https://docs.wandb.ai/self-hosted/local
然后就可以本地访问了。

测试

有两个脚本和测试有关,test.py是用来跑测试集测性能的,detect.py是用来测试文件夹或摄像头的。

python detect.py --source data/images --weights yolov5s.pt --conf-thres 0.25

在run/detect下即可找到图像画有目标框的图像(也可以在执行detect.py的时候指定--view-img选项,即可显示图像):

结语

至此就训练出了一个简单的检测模型呢,虽然很简单,不过基本流程通了。在走通流程后就要继续了解实现的细节,如何调参等等了。可以从了解网络结构开始,可参考 [https://zhuanlan.zhihu.com/p/343195876](https://zhuanlan.zhihu.com/p/343195876

注:如果数据集链接过期了,关注 老司机的视觉屋,回复pikachu即可获取链接

目标检测数据集(皮卡丘)
日志合成的数据集 %matplotlib inline import gluonbook as gb from mxnet import gluon, image from mxnet.gluon imp ...
2
bzoj2324[ZJOI2011]营救皮卡丘
日志题面:一张无向带权连通图,点数n+1(标号0…n),边数m,现在有k个人在0号点,要求依次摧毁1,2,3….n号点.假如至少一个人经过了点x,就认为点x被摧毁了.只有编号比x小的点都被摧毁才能经过点x ...
1
BZOJ 2324: [ZJOI2011]营救皮卡丘
日志2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2340  Solved: 963[Submit][Stat ...
1
P4542 [ZJOI2011]营救皮卡丘
日志传送门 分析一下题目,发现每个点必须至少走过一次,并且对于一个人的路径,他摧毁的点编号一定是递增的 并且在摧毁点 $i$ 之前,他不能经过 $i+1$ 到 $n$ 的点,考虑设 $dis[i][j], ...
1
纯CSS3制作皮卡丘动画壁纸
日志前言 明天就放假了,趁着今晚的空挡时间来写这篇博客——这是我昨晚实现的一个简单的CSS3动画效果.话说还得缘起我逛了一下站酷网,然后不小心看到了一张皮卡丘的手机壁纸,觉得很可爱,然后觉得这种效果是可以 ...
1
BZOJ2324 [ZJOI2011]营救皮卡丘 费用流
日志题目 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道 ...
1
bzoj 2324 营救皮卡丘
日志2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1440  Solved: 560 Description ...
1
皮卡丘的梦想2(线段树+二进制状态压缩)
日志Description 一天,一只住在 501 实验室的皮卡丘决定发奋学习,成为像 LeiQ 一样的巨巨,于是他向镇上的贤者金桔请教如何才能进化成一只雷丘. 金桔告诉他需要进化石才能进化,并给了他一个 ...
1
BZOJ 2324 [ZJOI2011]营救皮卡丘 费用流
日志本人实行诱骗拐卖(利用自然分层与实际意义),正解拼接补充(充分利用最大流限制(不浪费任何一个走出去的机会而不是不浪费任何一个已有的流)与问题转换) #include <cstdio> #i ...
1
bzoj2324 [ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流
日志原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...
1
洛咕P4542 [ZJOI2011]营救皮卡丘
日志套路题? 感觉讲不清,先写建图 把每个点拆成两个,A和B, S->Ai流量=1费用=0,Bi->T流量=1费用=0, Ai->Bj流量=1费用=ij最短路 还有一个特殊的s点,S-& ...
1
bzoj 2324 [ZJOI2011]营救皮卡丘(floyd,费用流)
日志2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1777  Solved: 712[Submit][Stat ...
1
BZOJ2324 [ZJOI2011]营救皮卡丘 有上下界费用流
日志[BZOJ2324][ZJOI2011]营救皮卡丘 Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的 ...
1
BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理
日志准备一周多的期末,各种爆炸,回来后状态下滑巨快...调了一晚上+80%下午 2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MB ...
1
BZOJ2324 ZJOI2011营救皮卡丘(floyd+上下界费用流)
日志虽然不一定每次都是由编号小的点向编号大的走,但一个人摧毁的顺序一定是从编号小的到编号大的.那么在摧毁据点x的过程中,其只能经过编号小于x的点.并且这样一定合法,因为可以控制其他人先去摧毁所经过的点.那 ...
1
bzoj 2324 ZJOI 营救皮卡丘 费用流
日志题的大概意思就是给定一个无向图,边有权值,现在你有k个人在0点,要求走到n点,且满足 1:人们可以分头行动,可以停在某一点不走了 2:当你走到x时,前x-1个点必须全部走过(不同的人走过也行,即分两路 ...
1
BZOJ 2324 ZJOI2011 拯救皮卡丘
日志网络流/费用流+Floyed Orz zyf 题解: 这题和星际竞速还有打印机两题的主体思路都是一样的 每个点一定要经过,并且要经过这个点,必须经过比这个点小的所有点.而且还存在一个附加源,但源到附加 ...
1
洛谷4542 [ZJOI2011]营救皮卡丘(最小费用最大流)
日志传送门 洛谷 Solution 这是一道神仙题! 考虑这个东西是个啥. emmm,如果两个点要到达,一定不能经过比他们大的. 所以Floyd搞定两点距离然后费用流跑一遍就是答案了! 代码实现 /* m ...
1
P4542 [ZJOI2011]营救皮卡丘(Floyd+网络流)
日志P4542 [ZJOI2011]营救皮卡丘 乍一看似乎没啥题相似的 仔细一看,$N<=150$ 边又是双向边,似乎可以用Floyd搞 先跑一遍Floyd处理出$dis[i][j]$ 注意到走据点 ...
1
OpenCV实战:人脸关键点检测(FaceMark)
日志Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author:    Amusi Date:       2018-03-20 ...
1