datawhale-布匹疵点智能识别baseline踩坑和改进思路
相比第一次task1的学习,我这几天又认真学习了一下docker的入门基础,详细内容可以看我发的其他三遍博客,不过最后由于pytorch版本的问题导致我的提交还是出现了一点小问题,不过我认为明天应该可以修改好。
docker知识可以看我的其他三篇博客链接:
赛题背景:
本赛场聚焦布匹疵点智能检测,要求选手研究开发高效可靠的计算机视觉算法,提升布匹疵点检验的准确度,降低对大量人工的依赖,提升布样疵点质检的效果和效率。
比赛要求:
要求算法既要检测布匹是否包含疵点,又要给出疵点具体的位置和类别,既考察疵点检出能力、也考察疵点定位和分类能力。
赛题分数计算方式:0.2ACC+0.8mAP
ACC:是有瑕疵或无瑕疵的分类指标,考察瑕疵检出能力。
其中提交结果name字段中出现过的测试图片均认为有瑕疵,未出现的测试图片认为是无瑕疵。
mAP:参照PASCALVOC的评估标准计算瑕疵的mAP值。
参考链接:https://github.com/rafaelpadilla/Object-Detection-Metrics
具体逻辑见evaluator文件。
需要指出,本次大赛评分计算过程中,分别在检测框和真实框的交并比(IOU)在阈值0.1,0.3,0.5下计算mAP,最终mAP取三个值的平均值。
数据预处理分析
baseline代码踩坑记录
本该运行sh train.sh但是会出bug所以只能几个文件分开跑
正确的步骤是:
1.首先运行convertTrainLabel.py
,当前目录生成了convertor
文件夹,这是解析json文件的过程。
2.接下来运行process_data_yolo.py
,当前目录生成process_data
文件夹,这是数据预处理过程。
注意要生成train
和val
数据集,因此将process_data_yolo.py
中的val替换成train再运行一次。
3.train.py 文件121行附近作如下修改
4.直接运行train.py,它提示你在weights中加入best.pt,我们可以下载预训练权重,这里我是用的是yolov5s.pt
在yolo.py文件中可以看到,默认使用的是yolov5s,所以下载yolov5s的预训练权重就行了,该名称best.pt
放入到weights
文件夹中
6.运行train.py,终于通了,修改下epoch的次数先跑一下
最后会得到两个生成的model下载下来用于我们进行后面的docker提交
docker提交
在rb大佬的帮助下,我终于懂了一点docker,然后开始自己操作,奈何bug太多还是没能成功,只是对于具体的过程已经了解清楚了,之后再试试。
由于pytorch1.4为老版本,不能读取pytorch1.7版本的best.pt,所以新建个Python脚本,把best.pt重新保存下。
ckpt = torch.load('best.pt', map_location=device) # 读取best.pt权重
torch.save(ckpt, 'new.pt', _use_new_zipfile_serialization=False) # 使用旧的方式保存
不过最后在这还是出了一点问题,希望有大佬能帮我解决一下
baseline的源码中,run.sh中为空,改为
python detect.py --source ./tcdata/guangdong1_round2_testB_20191024
创建Dockerfile(无后缀),文件内容如下
# Base Images
## 从天池基础镜像构建
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3
## 把当前文件夹里的文件构建到镜像的根目录下
ADD . /
## 指定默认工作目录为根目录(需要把 run.sh 和生成的结果文件都放在该文件夹下,提交后才能运
行)
WORKDIR /
## 镜像启动后统一执行 sh run.sh
CMD ["sh", "run.sh"]
创建镜像
在该目录用powershell打开
登入阿里云上自己创建的镜像仓库
进行docker build -t …
查看镜像id:docker images
进入容器:docker run -it 你自己的镜像 /bin/bash
往容器中安装必要的包
pip用镜像源 安装这三个包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scipy
其实之后还有一些配置和操作的坑,大家可以参考这两位大佬写的博客去做。我也还在尝试当中
链接1
链接2
我尽力了呜呜呜,还是太菜了,下次努力。
改进思路
虽然我最后提交不行,但是我大概能看到一些这个目标检测的一些问题和思路。
- 数据种类分布不均匀,对样本数量较少的标签进行过采样和重采样处理,利用数据扩增对数据进行更新和变化,还可以采用focal loss,标签平滑等损失函数来处理,在训练方面,除了常规的数据增强之外,我们观察到原始的标注存在不准确的情况,为了使网络适应这种不确定性,我们在训练时随机对原始的标注框进行了抖动,是网络能够学习这种不确定性。
- 缺陷具有极端的长宽比,这个是我看一个大佬写的,之前的知乎和动手学深度学习上我也接触过这个概念,anchor 设置:考虑到样本的长宽比差异较大,通过聚类分析可以发现,原始的anchor并不能满足当前任务的需要,通过增加anchor数目,提高检测性能。
- 多尺度训练:多尺度训练(Multi Scale Training, MST)通常是指设置几种不同的图片输入尺度,训练时从多个尺度中随机选取一种尺度,将输入图片缩放到该尺度并送入网络中FPN 增加融合因子 Effective Fusion Factor in FPN for Tiny Object Detection
- TA和模型融合是万能tricks,也是kaggle和天池里面必备的方法。