全球人工智能技术创新大赛【热身赛一】布匹疵点智能识别 笔记_天池布匹缺陷检测比赛

主要代码参考了 https://github.com/datawhalechina/team-learning-cv/tree/master/DefectDetection 的 baseline,使用的 YOLOv5 系列模型,关于源码的注释在 YOLOV5 训练代码 train.py 注释与解析

记录一下遇到的问题:

1、数据预处理问题

train.sh 文件中,第二步使用了 process_data_yolo.py,源码中关于数据集存放位置存在问题,只写了 val 的处理,没写 train 的处理,所以生成的 process_data 文件夹中, 只有 val 而没有 train,训练时会报错。

所以不能直接用 train.sh 脚本,要顺序运行里面的命令,到第二步的时候,先执行一遍,如下图做修改后再执行一遍,从而把训练集和验证集都准备好。

2、 预训练权重问题

使用如下命令训练

ckpt = torch.load('best.pt', map_location=device)    # 读取best.pt权重
torch.save(ckpt, 'new.pt', _use_new_zipfile_serialization=False)    # 使用旧的方式保存

加载 YOLOv5 的官方预训练权重,结果报错

pip install opencv-python
pip install matplotlib
pip install scipy

谷歌后找到的官方源码的 issue,https://github.com/ultralytics/yolov5/issues/222#issuecomment-650999053

在源码的 120 行做如下修改,就能正常加载权重了。

====================================================================

这里做一下更正,这个地方权重不匹配,主要是因为 baseline 里提供 yolov5 模型是老版本,而代码里通过谷歌 api 下载的是最新权重,所以存在 key 不匹配的问题,所以最好的方法还是去 yolov5 的官方仓库,下载最新的代码文件。

====================================================================

3、docker 构建

3.1 本地训练

首先在本地训练几个 epoch,生成 best.pt 权重文件,训练的方式随便,Windows 环境、Linux 环境、docker 训练都可以。然后使用把用得上的文件拷贝到要构建 docker 的文件夹中。

但要注意 docker 教程中拉取的 Pytorch 镜像为 1.4 版本(registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3),我们现在常用的 pytorch 环境为 1.7,在保存权重的时候会使用新版本的序列化方式,导致 docker 测试时权重读取序列化失败,所以新建个 Python 脚本,把 best.pt 重新保存下。

# 解决方法:
apt update
apt install libgl1-mesa-glx
apt-get install -y libglib2.0-0

3.2 构建 docker

baseline 的源码中,run.sh 中为空,改为

python detect.py --source ./tcdata/guangdong1_round2_testB_20191024

然后使用 docker build 命令构建镜像

通过 docker run 进入容器

注意点:

根据 https://github.com/datawhalechina/team-learning-cv/blob/master/DefectDetection/docker%E6%8F%90%E4%BA%A4%E6%95%99%E7%A8%8B.pdf 构建完镜像后,

进入容器后安装额外依赖

pip install opencv-python
pip install matplotlib
pip install scipy

注意安装完后检查 opencv 能否正常运行,直接在终端打开 Python,然后 import cv2,如果报错的话,

# 解决方法:
apt update
apt install libgl1-mesa-glx
apt-get install -y libglib2.0-0

注意此时不要关闭容器,因为如果关掉的话,刚才安装的依赖不会被更新到刚才的镜像中!

要想使镜像也实现这些改动,需要把当前容器另存为一个新的镜像。

所以教程里让退出但不关闭容器。

使用 docker commit 将当前容器提交为镜像,然后使用 docker images 列出所有镜像,最新的一条就是刚才另存为的新镜像,可以看到 imageID 和刚才构建出的那个镜像是不同的。

然后就可以

docker run your_image(自己替换) sh run.sh

运行自己的镜像,看是否报错,因为现在目录里没有 tcdata 这个测试文件夹,如果报文件相关的错误就是正常的,或者可以自己建个文件夹试一下。

过程中,如果报错的话,一般就是 run.sh 有问题,可以在容器内修改完再另存为镜像一次(同上),这样比较省时间。或者参考修改已有 docker 容器中的内容,操作规范一些。

4 推送镜像

直接 docker push 到自己的镜像仓库。

由于我是训练完构建的镜像,基础环境加上权重,镜像一共 9.44G,非常大,推送很慢,估计在 600k 左右,过程中如果因为网络问题想中断重试的话,可以 Ctrl+C 打断,已经推送成功的 layer 会保存,不需要重新传(不知道保存多久),但是传到一半的会重新开始,要注意。

5 提交

这里注意账号密码不要填错,我一开始填错了密码,导出出现了 ImagePullBackOff 错误。

训练了 50 个 epoch 的结果如下,确实挺差的。。。

6 更新

多训练几个 epoch 后,生成新的权重文件 best.pt,使用 docker cp 命令将其拷贝到容器中,然后 docker commit 保存为新的镜像,重新 docker push

可以看到只需要重新上传权重文件就可以了,其他层都已存在,比第一次上传 9 个 G 快很多

posted @ 2024-05-21 19:52  钢之炼丹术师  阅读(86)  评论(0)    收藏  举报