目录
代码已开源,具体参见: https://github.com/ztfmars/tianchi_cvdetect
1.代码参考
参考的baseline- yolov5修改版
相关训练调节笔记参见 链接
代码讲解视频参考 链接
2.环境安装
个人环境说明:
- win10
- 12g内存, nvidia gtx 1060, cuda10.1
注意:
本地训练使用的是pytorch == 1.7
环境,其他安装包参见require.txt
docker 中的 pytorch==1.4
(这个问题后续会说明)
因为官方的yolov5.pt
权重是使用torch==1.7
以上的,所以使用其他版本torch加载的时候会有问题,为了避免问题。建议使用这个1.7的版本。
安装分为3步:
step1: 我是使用的python3.7.4
, cuda10.2
, 添加清华源
,快捷安装torch1.7.1
如下所示:
(torch1.7) PS C:\Users\ztfma> conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
(torch1.7) PS C:\Users\ztfma> conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
(torch1.7) PS C:\Users\ztfma> conda config --set show_channel_urls yes
(torch1.7) PS C:\Users\ztfma> conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/win-64/
(torch1.7) PS C:\Users\ztfma> conda install pytorch torchvision torchaudio cudatoolkit=10.2
step2: 建议按照下面总结的内容安装一下吧:
require.txt中13行单独安装(原来的连接地址,因为墙的原因下载不了;下载gitee版本只是支持linux,安装的时候出现如下状况)
step3: 注释掉13行之后之后安装其他环境:
pip install -r requirements.txt
3.docker预备知识
参见博文
4.过程详述
4.1 数据下载和预处理
- 下载训练的数据,并且放置到文件夹
train_data
- 下载yolov5权重best.pt,放置到
weights
文件夹
4.2. 训练模型
-
总体训练过程
-
图片预处理过程:将图片变成yolo格式, 我处理成了
640x640
train.sh
文件中,第二步使用了process_data_yolo.py
,源码中关于数据集存放位置存在问题,只写了val的处理,没写train的处理,所以生成的process_data文件夹中, 只有val而没有train,训练时会报错。
所以不能直接用train.sh
脚本,要顺序运行里面的命令,到第二步的时候,先执行一遍,如下图做修改后再执行一遍,从而把训练集和验证集都准备好。
-
没有使用baseline,我的小破本跑yolov5x压力太大,换成官方的代码,自己稍微改动了一下。使用
yolov5s.pt
。 -
使用预训练权重去进行训练过程:
相关参数说明的内容,可以参见链接
(1)考虑到类间差距较大,数据分布不均衡,修改focal_loass_gamma=1.5
(2)根据自己的GPU现存大小调节batchsize大小,当然越大越好(gtx1060 赶脚真的有点弱鸡)
运行程序:
python train.py --cfg models/yolov5s.yaml --batch-size 2
batch-size不能太大,否则资源占用率还是非常高的
- 其他错误汇总
(1)Python Matplotlib: 解决 Tcl_AsyncDelete: async handler deleted by the wrong thread
修改 utils.py
line13-14
将原本的import matplotlib.pyplot as plt
修改成以下:
import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot as plt
https://blog.csdn.net/qq_39560620/article/details/105734243
(2)总是提示读取tcdata路径有问题
,打印出来的路径应该是末尾多了\r
。这个是win系统带的,在vim里面一般不容易发现。删掉重写即可
4.3 docker上传到阿里docker仓
进入到自己要提交的文件夹里面:
(1) 修改run.sh
baseline的源码中,run.sh中为空,改为
python detect.py --source ./tcdata/guangdong1_round2_testB_20191024
(2)注册阿里的docek镜像服务,并且且拉取镜像
注意:因为win10都是存储在c盘,所以占用资源非常大,留足空间(>15g)
具体过程, 参见链接
- 命令总结:
(以下内容相关地址、名称为假,自行对应相应的、自己的变量)
#1. 登录阿里云Docker Registry
$ sudo docker login --username=小白前来报道(自己的账号名称) registry.cn-shenzhen.aliyuncs.com)(自己的阿里云公网地址)
#用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
#您可以在访问凭证页面修改凭证密码。
#2. 从Registry中拉取镜像
$ sudo docker pull registry.cn-shenzhen.aliyuncs.com/ztfmars_cv_detect/ztfmars_cv_detect:[镜像版本号](拉去的具体镜像内容,具体参见基础镜像说明:
https://tianchi.aliyun.com/forum/postDetail?spm=5176.12586973.0.0.176a22322ijx
xm&postId=67720)
- 实际过程:
PS C:\Users\ztfma> docker login --user=xxxx_name registry.cn-shenzhen.aliyuncs.com/ztfmars_cv_detect/ztfmars_cv_detect
unknown flag: --user
PS C:\Users\ztfma> docker login --username=xxxx_name registry.cn-shenzhen.aliyuncs.com/ztfmars_cv_detect/ztfmars_cv_detect
Password:
Login Succeeded
PS C:\Users\ztfma> docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3
1.4-cuda10.1-py3: Pulling from tcc-public/pytorch
7ddbc47eeb70: Already exists
c1bbdc448b72: Already exists
8c3b70e39044: Already exists
45d437916d57: Already exists
d8f1569ddae6: Already exists
85386706b020: Already exists
ee9b457b77d0: Already exists
be4f3343ecd3: Pull complete
30b4effda4fd: Pull complete
b398e882f414: Pull complete
64e532b06236: Pull complete
31188d0173e6: Pull complete
4a1386f93f29: Pull complete
87d47d0287c7: Pull complete
7a932c9d3ad4: Pull complete
Digest: sha256:c612782acc39256aac0637d58d297644066c62f6f84f0b88cfdc335bb25d0d22
Status: Downloaded newer image for registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3
(3)进入自己要打包的文件夹中,构建新的镜像
Dockerfile
# Dockerfile
# Base Images
## 从天池基础镜像构建
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3
## 把当前文件夹里的文件构建到镜像的根目录下
ADD . /
## 指定默认工作目录为根目录(需要把 run.sh 和生成的结果文件都放在该文件夹下,提交后才能运行)
WORKDIR /
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install opencv-python
RUN pip install matplotlib
RUN pip install scipy
RUN pip install tensorboard
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get clean && apt-get update
RUN apt update && apt install -y libgl1-mesa-glx && apt-get install -y libglib2.0-0
## 镜像启动后统一执行 sh run.sh
CMD ["sh", "run.sh"]
利用Dockerfile生成新的镜像
docker build -t registry.cn-shenzhen.aliyuncs.com/ztfmars_cv_detect/ztfmars_cv_detect(公网地址):1.0(tag号) .
注意:
-t
表示利用本地Dockerfile
构建镜像- 最后的点
.
表示本地文件夹,不能丢了哦 - 大概花了半小时,耐心等待
最终形成了新的镜像:
(4)将构建的镜像上传到阿里云上代码仓Registry
#3. 将镜像推送到Registry
$ sudo docker login --username=小白前来报道 registry.cn-shenzhen.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/ztfmars_cv_detect/ztfmars_cv_detect:[镜像版本号]
$ sudo docker push registry.cn-shenzhen.aliyuncs.com/ztfmars_cv_detect/ztfmars_cv_detect:[镜像版本号]
#请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
#4. 选择合适的镜像仓库地址
#从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
#如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-shenzhen.aliyuncs.com 作为Registry的域名登录。
#5. 示例
#使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-shenzhen.aliyuncs.com/acs/agent:0.7-dfb6816
#使用 "docker push" 命令将该镜像推送至远程。
$ sudo docker push registry-vpc.cn-shenzhen.aliyuncs.com/acs/agent:0.7-dfb6816
(5)提交相关结果docker镜像地址和密码,到比赛链接
5.结果预览
暂时还未出结果,但是我在本地反复跑了一下应该是木有问题的。
6 基础迭代和提升
迭代一 数据增广
- (1) baseline里面的yolov5感觉应该是比较老的版本了(第一次构建的时候,采用的是baseline的代码),所以重新下载了最新的(2021/2/21下载)的yolov5,这个代码更新还是非常快的,又有了很多的优化(common文件里面增加了c3, 激活函数也换了,增加了mosaic等),所以个人觉得应该在提高精读上面有更大的提升空间。
A.主要改了一个关于分类的coco128.yaml函数,detect函数,还有一些小bug等;
B.为了快速迭代和试水,我是用了yolov5s, batch-size=2, epochs=200;
训练1 epoch 大约1分钟(GTX1060),还是非常快的,而且体积夜宵
C. 为了训练快速,我对于图片尺寸弃用1080.改为640,这样体积也小了很多 - (2) 因为从docker拉取的是torch 1.4的版本(在推荐阿里元里面好像没有看到torch1.7的镜像),但是安装的时候需要安装torch1.7的版本。所以适配Dockerfile里面的安装,让他能够正常跑最新的yolov5.附上相关的Dockerfile。
其实就是在最下面添加了一个安装最新yolov5的 requiremet.txt, 记得要加–ignore-installed
# Dockerfile
# Base Images
## 从天池基础镜像构建
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3
## 把当前文件夹里的文件构建到镜像的根目录下
ADD . /
## 指定默认工作目录为根目录(需要把 run.sh 和生成的结果文件都放在该文件夹下,提交后才能运行)
WORKDIR /
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install opencv-python
RUN pip install matplotlib
RUN pip install scipy
RUN pip install tensorboard
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get clean && apt-get update
RUN apt update && apt install -y libgl1-mesa-glx && apt-get install -y libglib2.0-0
RUN apt-get install -y vim
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --ignore-installed -r requirements.txt
## 镜像启动后统一执行 sh run.sh
CMD ["sh", "run.sh"]
- 最新的参数设置里面很多训练时候数据增广的参数设置都是为0(不做数据增广,例如fl_gamma, retation等),根据自己经验,稍微修改了一下,感觉应该可以提高数据泛化能力。具体参见如下:
- 检测的conf thred可以在设置稍微小一点,以便于提高acc, (因为mAP还是惨不忍睹啊)
结果比baseline还是有了一点进步:
不过mAP还是低的吓人。。。。。。
迭代二 更换更大的尺寸,提升map
- 使用 yolo5l :因为看了一下官方的map,这个map赶脚和5x相差不多,但是体积确实小了快一半。目测训练的时候,我的gtx1060小本还可以接受。
- 有点失误,开始时候训练的是200epoch,这个精度应该会提升比较大。。。。但是因为种种电脑出了点问题。所以只是使用 epoch=100, batchsize=8(gtx 承受理性范围,batchsize=16赶脚内存就不太够用了, 训练1epoch大约4分钟)。。。。感觉训练完了map还在提升,应该还可以继续训练,我TM想训练500epoch,但是我还得戴着电脑办公,没办法。。。。
结果:
确实是map有了2个点的提升。。我感觉的map大概能提升到6左右,如果训练epoch足够多的话。。。。。
迭代三: 使用集成,融合5l和5s
新的yolov5 提供了多个模型融合的参数。修改了一下detect.py
函数相关路径和加载方式,可以直接使用多模型融合策略。
(1) 使用前面训练的5s, 5l做融合, img-size=1080,map大概能提升1-2个点,但是运行时间确实是大大提高了。
(2) 如果让img-size =640,是不会timeout的,但是精度反而下降了。
当然5s, 5l本身训练的并不是充分,所以继承后提升也不太大。模型继承,理论上应该有多个点的提升。
相关教程,参见链接
迭代四:使用全部数据训练
前面一直在1k张图片做训练,但是实际上所有的数据大概有4k。在最后一天看了别人的 博客才想起来还有3/4的数据没有利用到啊!!!!
因为时间比较紧凑,所以只是使用5l进行了50 epoches。训练的map是大大提升了!但是在想训练比赛都截止了,太可惜了。
(1)关于数据增广的内容,几个类别确实是分布及其不均衡、而且大小相差极大,数量相差极大,开始并没有做深入分析。参见这个大佬的分析博客内容(人为增加缺少样本数量的方法很赞,学习了):链接 这个数据增广的效果是好的一批!大佬是遥遥领先!
(2)我记得好像还有个paper是直接复制粘贴缺少的类别在原图中做数据增广、补充缺少类别,具体的想不起来是那个了
最终只是取得了 top 12/ 1619, 连前10都没挤进去,太遗憾了。。。
其他内容:
(1)TTA:参见yolov5教程
eg:
python detect.py --weights yolov5s.pt --img 832 --source ./inference/images/ --augment
(2) ENSEBLE: 参见yolov5教程
eg:
python detect.py --weights yolov5s.pt --weights yolo5l.pt
(3) 其他的各种缺陷检测的tricks: 参见链接
七 复盘反思
- (1)数据!!!!
A. 没有使用全部的数据训练这个是特别大的一个损失,而且开始制作的时候把数据crop成640x640,这个尺寸太小了,跟1080x1080训练出来的map一比相差很大。但是不做crop一个epoch就需要半个小时,感觉早期应该提早训练争取更多的 时间,结果或许会更好。
B. 并没有开展数据的分析和有效的增广方式彻底解决类间距不平衡的问题。这个大佬的方法应该学习,也应该寻找更多的 有效的方法。数据是比赛的第一大步,得数据者得名次。
- (2)框架和模型的选择
A. mmdetection这个可能是比赛的必备利器了,这个还不会、并且没有更新学习真的是有点丢人了。
B. yolo5其实大家都是在使用原来的模型调参,并没有太多原创的东西。这个检测小目标和多尺度变化的内容,感觉确实是没有2 stage的算法好一些。cascade rcnn确实应该看一下。这个大佬用这个模型训练的话,确实检测的map效果更好。参见 link, 而且他分享的2019年的工业检测的哪一个冠军队伍真的强,参见
2019广东工业智造创新大赛总决赛亚军比赛攻略——BUPT_CAD队
C. 还有很多比较好的模型,很多好的方法没有聚合在一起,这个是后续需要努力的一个方向。多一些SOTA并且有效的方法确实是更重要
- (3)资源
哎,缺少免费的资源的啊,1060真的是有点太带不动大量的数据了啊。看来需要走上一条氪金的路了。。
A. 听人说 恒源智慧云正在送免费的资源,注册就送50元,好像可以免费白嫖啊。大家可以试一下,下方为链接:
https://gpushare.com/auth/register?user=15*****1560&fromId=b350071f629&source=link
B. paddle也有自己的paddledetection, 可以白嫖ai studio,但是只能用他自己的框架好像;去阿里白嫖的话,好像也有DSW,但是CPU貌似有点低。
C. 好像还有mistGPU,后续待探索,链接:
https://mistgpu.com/
ref:
全球人工智能技术创新大赛链接
安装pytorch1.7
yolov5参数说明
yolov5官方地址
2019广东工业智造创新大赛总决赛亚军比赛攻略——BUPT_CAD队
数据增广范例