由于自己在实践的过程中遇到很多坑,故在这里尽量详细地记录下来问题和解决办法。
训练在服务器上(初期使用两块V100,后期准备全部数数据集传到服务器上后,多用几块tesla一起跑)完成,代码修改是vs code上使用sftp插件与服务器同步了,很方便;最后镜像的部分由于服务器我的账户权限不足没法使用docker,智能在win10本地上装了docker。
Docker?No Docker
先不用管docker的内容,docker只是个提交工具而已,先把数据下载下来,在本地成功跑通baseline之后再考虑docker的知识。
所以可以在本地训练完之后再去看下面的docker 训练场这一步。
Docker练习场
过一遍这个加上思考就差不多了
总而言之,我的理解就是:
- 第一步:本地训练
- 第二步:训练好的模型放于某文件夹
- 第三步:在该文件夹上构建镜像(撰写Dockfile,然后build)(注意ignore文件夹下的数据集,或者新建文件夹把除了数据之外的文件都copy过去)
- 第四步:镜像 run -> 容器,并在容器安装所需环境
- 第五步:推送镜像至镜像仓库,并在天池提交镜像链接
具体每一步的代码见其余细心网友的blog,这里推荐一个。
下载数据
.txt文件中存储着数据的地址,复制到browser中下载即可
注意: baseline中只使用了guangdong1_round2_train2_20191004_images的数据集,故只需要在train_data中存放对应的img文件夹和标注文件夹即可。(下一步会记录)
按照baseline教程来搭建训练环境等
我个人是在实验室的服务器搭建了python的虚拟环境pytorch_yolo,安装了所有依赖库(可以直接pip install -U -r requirements.txt ,若依赖文件中某些模块下载失败,再分别pip install或者conda install即可,只要是在一个virtual env里,python的开源模块随意安装卸载);
环境搭建好后,在clone下的DefectDetection文件夹下新建train_data文件夹,将下好的数据集解压放在train_data内;
由于baseline中某些地方并没有写完整,故不要直接运行sh train.sh,而是对.py文件做些修改,再分别python .py文件,按以下步骤走:
- python convertTrainLabel.py, 此时工作目录下会出现convertor文件夹;
- 先运行一遍process_data_yolo.py, 此时工作目录下会出现process_data文件夹,但打开后发现仅有val数据;所以此时要修改process_data_yolo.py中的val路径为train路径(这个应该很好理解,这里不做演示了),再次运行process_data_yolo.py,即可在process_data文件夹下得到完整train和val的数据集;
- 由于我们就是按照baseline里的文件目录来创建的,故这里其实不需要修改coco128.yaml;
- 由于baseline文件夹中缺乏权重文件,可以到yolov5的github仓库下载,提供的是一个download_weights.sh命令文件,我在服务器上运行sh download_weights.sh后只下载成功了yolov5s.pt,而且还很慢,可以参考其他博客看看有无更好的预权重下载渠道;
- 训练:
python train.py --epochs 30 --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --device 0,1
(注意这里的参数都是可改动的,其他参数需要改动可以看下train.py的main函数里面都设置了什么参数,但基本上常用的就batchsize,device,weights等) - 训练结束后,weights文件夹中会出现last.pt和best.pt
本地跑通后在当前文件夹构建镜像
由于实验室的服务器我没有sudo权限,也没有把我加到docker的用户组里,所以我没办法在服务器上构建镜像…
故在win10本地安装docker及使用:参考博客,不过我后期安装的WSL,但暂时能用,因为我电脑装了双系统了,再装个WSL有点鸡肋
镜像流程见github教程:
- 按照教程一步一步来即可;
- build的时间略长,耐心等待;
- 安装了opencv后的确import cv2报错,按照解决办法操作;
- import cv2 仍报错的话运行:
apt install libgl1-mesa-glx --fix-missing
几个常用命令:
-
修改容器中的文件:可以选择Ctrl+P+Q退出且不关闭容器,然后copy至容器内,再commit(具体过程可参考博客
-
进入在运行的容器中:
docker exec -it 6cbfbc705aee /bin/bash
参考 -
容器内安装vim(方便修改文件):
apt-get install -y vim
-
查看镜像信息:
docker images
-
查看容器信息:
docker ps
-
保存容器为镜像:
docker commit container_id 镜像仓库:版本号
自己的训练及镜像流程
训练:python -m torch.distributed.launch --nproc_per_node 2 train.py --weights weights/yolov5s.pt --epochs 200 --batch-size 16 --cfg models/yolov5s.yaml --device 0,1
修改容器中的文件:可以选择Ctrl+P+Q退出且不关闭容器,然后copy至容器内,再commit(具体过程可参考博客https://blog.csdn.net/dechengtju/article/details/85009836)
docker run -it 镜像ID /bin/bash
ctrl+p+q 退出
从宿主机拷贝文件到容器:docker cp /opt/test/file.txt mycontainer:/opt/testnew/
进入在运行的容器中:docker exec -it 容器ID /bin/bash
ls -l查看时间戳是否改变来确定是否copy成功
保存容器为镜像:docker commit container_id 镜像仓库:版本号
docker stop 容器ID (exit退出容器(容器会关闭))
接下来push 镜像:
登录:docker login --username=孟寻carl registry.cn-guangzhou.aliyuncs.com
tag: docker tag [ImageId] registry.cn-guangzhou.aliyuncs.com/carl_namespace/defect_detect_new:[镜像版本号]
push: docker push registry.cn-guangzhou.aliyuncs.com/carl_namespace/defect_detect_new:[镜像版本号]
容器内安装vim(方便修改文件):apt-get install -y vim
查看镜像信息:docker images
查看容器信息: docker ps
保存容器为镜像:docker commit container_id 镜像仓库:版本号
import cv2 仍报错:
apt install libgl1-mesa-glx --fix-missing
数据
每张图片对应的瑕疵不止一处;
通过convertTrainLabel 将数据集划分为1:4,存放在convertor/images/train, val中(label文件夹中每个图片只存了一个defect label, 以yolo要求的txt格式存储)
目前来看batchsize越小越好(慢),以及imagesize修改之后640,640也变得更好了。
自己的代码运行次序
- convertTrainLabel.py
- process_data_yolo.py
- train.py
- pt_edit.py,运行后会生成new.pt,接下来预测要修改默认参数best.pt为new.pt
- 接下来代码运行结束,直接将pt文件copy到容器中并保存为新版本镜像即可。
比赛提交
每次其实只需要更改版本号,重新输入密码即可。