↑↑↑关注后"星标"Datawhale

每日干货 & 每月组队学习,不错过

Datawhale干货

作者:江保祥,厦门大学

一、布匹缺陷检测比赛分析

1. 赛题背景

去年的广东工业大赛已入选到全球人工智能技术大赛热身赛,大赛聚焦布匹疵点智能检测,要求选手研究开发高效可靠的计算机视觉算法,提升布匹疵点检验的准确度,降低对大量人工的依赖,提升布样疵点质检的效果和效率。

比赛地址:https://tianchi.aliyun.com/competition/entrance/531864/introduction

2. 比赛要求

要求算法既要检测布匹是否包含疵点,又要给出疵点具体的位置和类别,既考察疵点检出能力、也考察疵点定位和分类能力。

3. 评估指标

赛题分数计算方式:0.2ACC+0.8mAP

ACC:是有瑕疵或无瑕疵的分类指标,考察瑕疵检出能力。

其中提交结果name字段中出现过的测试图片均认为有瑕疵,未出现的测试图片认为是无瑕疵。

mAP:参照PASCALVOC的评估标准计算瑕疵的mAP值。

4. 提交说明

平台采用了基于GPU计算资源的提交镜像的方式,将本地代码打包成镜像提交,推送至阿里云容器镜像仓库后,在天池提交页面中输入镜像地址、用户名和仓库密码。由比赛平台拉取镜像运行, 运行结束即可在成绩页面查询运行日志及评测结果。

二、比赛数据分析

1. 数据大小

数据大小 官方一共提供了9576张图片用于训练其中有瑕疵图片5913张,无瑕疵图片3663张 瑕疵类别共有34个类别,在最终提交结果上对一些相似类别进行了合并后,共分为15个瑕疵类别。图片尺寸:4096 * 1696。

2. 比赛难点

种类较多,且数据分布不均 缺陷形状具有极端的长宽比 图片尺寸较大,部分缺陷尺寸小,小目标问题。

三、快速实现比赛Baseline

完整代码已开源 或后台回复 缺陷检测 下载
开源地址:https://github.com/datawhalechina/team-learning-cv/tree/master/DefectDetection

视频讲解:https://www.bilibili.com/video/BV1dK4y1Q7dc

1. 开源框架选择

任务分析

此次任务是布匹瑕疵检测,首先考虑的应该是目标检测框架。当前目标检测主要分为one-stage和two-stage两种类型,以YOLO,SSD等框架为代表的one-stage速度快,以Faster-RCNN为代表的two-stage框架精度高。基于本次任务时间有限制在1小时内,因此采用单阶段YOLOV5的方案

环境配置

# pip install -U -r requirements.txt#Output:
Cython
numpy==1.17
opencv-python
torch>=1.4
matplotlib
pillow
tensorboard
PyYAML>=5.3
torchvision
scipy
tqdm

训练设置

$ python train.py --data coco.yaml --cfg yolov5s.yaml --weights '' --batch-size 64yolov5m                                40yolov5l                                24yolov5x                                16

测试设置

$ python detcet.py --source ./inference/images/ --weights yolov5s.pt  --conf 0.4

2. 数据预处理

数据格式转换

代码详见convertTrainLabel.py ,部分代码及分析如下

#读取比赛数据标签文件      josn_path = "./train_data/guangdong1_round2_train2_20191004_Annotations/Annotations/anno_train.json"image_path = "./train_data/guangdong1_round2_train2_20191004_images/defect/"with open(josn_path, 'r') as f:temps = tqdm(json.loads(f.read()))for temp in temps:name = temp["name"].split('.')[0]path = os.path.join(image_path, name, temp["name"])im = cv2.imread(path)sp = im.shapeimage_h, image_w = sp[0], sp[1]x_l, y_l, x_r, y_r = temp["bbox"]#获取标签对应的类别一共15种if temp["defect_name"]=="沾污":defect_name = '0'elif temp["defect_name"]=="错花":defect_name = '1'.......
#标注格式转换 江都区并存入列表x_center = (x_l + x_r)/(2*image_w)y_center = (y_l + y_r)/(2*image_h)w = (x_r - x_l)/(image_w)h = (y_r - y_l)/(image_h)name_list.append(temp["name"])c_list.append(defect_name)image_h_list.append(image_w)image_w_list.append(image_h)x_center_list.append(x_center)y_center_list.append(y_center)w_list.append(w)h_list.append(h).....#读取列表 list 数据,并划分训练集和验证集
index = list(set(name_list))
print(len(index))
for fold in [0]:val_index = index[len(index) * fold // 5:len(index) * (fold + 1) // 5]print(len(val_index))for num, name in enumerate(name_list):print(c_list[num], x_center_list[num], y_center_list[num], w_list[num], h_list[num])row = [c_list[num], x_center_list[num], y_center_list[num], w_list[num], h_list[num]]if name in val_index:path2save = 'val/'else:path2save = 'train/'#数据写入 yolov5文件格式if not os.path.exists('convertor/fold{}/labels/'.format(fold) + path2save):os.makedirs('convertor/fold{}/labels/'.format(fold) + path2save)with open('convertor/fold{}/labels/'.format(fold) + path2save + name.split('.')[0] + ".txt", 'a+') as f:for data in row:f.write('{} '.format(data))f.write('\n')if not os.path.exists('convertor/fold{}/images/{}'.format(fold, path2save)):os.makedirs('convertor/fold{}/images/{}'.format(fold, path2save))sh.copy(os.path.join(image_path, name.split('.')[0], name),'convertor/fold{}/images/{}/{}'.format(fold, path2save, name))

3. 模型训练

数据路径设置:编辑一个数据路径文件夹yaml文件

例如:data/coco128.yaml

# train and val datasets (image directory or *.txt file with image paths)
train: ./process_data/images/train/
val: ./process_data/images/val/# number of classes
nc: 15# class names
names: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12','13', '14', '15']

模型文件选择:yolov5x.yaml, yolov5m.yaml, yolov5l.yaml yolov5s.yaml文件

可以选择合适的模型文件,从左到右精度下降,但是速率增大

nc: 15  # number of classes
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple
anchors:- [116,90, 156,198, 373,326]  # P5/32- [30,61, 62,45, 59,119]  # P4/16- [10,13, 16,30, 33,23]  # P3/8
backbone:# [from, number, module, args][[-1, 1, Focus, [64, 3]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4[-1, 3, BottleneckCSP, [128]],...........

模型训练

$ python train.py --data coco.yaml --cfg yolov5s.yaml --weights '' --batch-size 64yolov5m                                40yolov5l                                24yolov5x                                16

4. 测试模型并生成结果

detect.py的输出结果的格式修改成提交结果的格式

#将输出结果的格式变成比赛需要提交的格式,并存入list,方便后面写入result.json文件中
if save_json:name = os.path.split(txt_path)[-1]print(name)x1, y1, x2, y2 = float(xyxy[0]), float(xyxy[1]), float(xyxy[2]), float(xyxy[3])bbox = [x1, y1, x2, y2]img_name = nameconf = float(conf)#add solution remove otherresult.append({'name': img_name+'.jpg', 'category': int(cls+1), 'bbox': bbox,'score': conf})print("result: ", {'name': img_name+'.jpg', 'category': int(cls+1), 'bbox': bbox,'score': conf})
#写入result.json文件中
if save_json:if not os.path.exists(save_dir):os.makedirs(save_dir)with open(os.path.join(save_dir, "result.json"), 'w') as fp:json.dump(result, fp, indent=4, ensure_ascii=False)

最后就是docker生成镜像,并提交镜像,至此就实现了比赛的Baseline了

四、改进思路

在实现比赛的Baseline后,可以说是完成了第一步,后面如果想要获取好的成绩就需要我们根据比赛的任务,比赛的难点。进行调整方案,修改网络,修改策略。

前面我们提到该布匹缺陷检测任务的难点主要有:

  • 数据种类分布不均匀

  • 缺陷具有极端的长宽比

  • 小目标问题

1. 数据种类分布不均匀

解决思路:

  • 过采样种类较少的样本

  • 数据扩增:在训练方面,除了常规的数据增强之外,我们观察到原始的标注存在不准确的情况,为了使网络适应这种不确定性,我们在训练时随机对原始的标注框进行了抖动,是网络能够学习这种不确定性

2. 缺陷具有极端的长宽比

解决思路:

  • anchor 设置:考虑到样本的长宽比差异较大,通过聚类分析可以发现,原始的anchor并不能满足当前任务的需要,通过增加anchor数目,提高检测性能。

  • 可变形卷积:增强特征提取能力,提高检测性能 方法:在 backbone结构的最后一个block采用可变形卷积核 优点:可变形卷积能够计算每个点的偏移,从最合适的地方取特征进行卷积

3. 小目标问题

解决思路:

  • 针对小目标的扩增方式:Copy-Pasted 也就是将小目标贴到图像中的任意位置并生成新的标注,并且粘贴的小目标可以进行随机变换(缩放,翻折,旋转等),这种方式通过增加每个图像中小目标的数量,匹配的 anchor 的数量也会随之增加,这进而提升了小目标在训练阶段对 loss 计算的贡献。

  • 多尺度训练:多尺度训练(Multi Scale Training, MST)通常是指设置几种不同的图片输入尺度,训练时从多个尺度中随机选取一种尺度,将输入图片缩放到该尺度并送入网络中

  • FPN 增加融合因子 Effective Fusion Factor in FPN for Tiny Object Detection

4.涨分Tricks

在实现对网络的改进后,我们可以使用一些比赛的涨分技巧

半监督学习

利用训练集训练好的模型预测测试集,将预测结果作为伪标签加入训练

测试增强

对检测图片进行翻折、旋转、色彩增强,然后分别对这些扩增图片进行预测,将多个预测结果进行融合

模型集成

多种模型进行预测,将一张图片的多个结果进行融合

阅读原文可以参与缺陷检测实践

“整理不易,三连

从0梳理1场CV缺陷检测赛事!相关推荐

  1. 【数据竞赛】从0梳理1场CV缺陷检测赛事!

    作者:江保祥,厦门大学 一.布匹缺陷检测比赛分析 1. 赛题背景 去年的广东工业大赛已入选到全球人工智能技术大赛热身赛,大赛聚焦布匹疵点智能检测,要求选手研究开发高效可靠的计算机视觉算法,提升布匹疵点 ...

  2. 从0梳理1场CV大赛(Top 3%)!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:阿水,北京航空航天大学 ,Datawhale成员 摘要:数据竞赛对 ...

  3. 从0梳理1场时间序列赛事!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:杰少,南京大学硕士 本文基于 2021 "AI Eart ...

  4. 从0梳理1场NLP赛事!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:徐美兰-lan,华南理工大学 摘要:这是从0实践竞赛第3篇,数据竞 ...

  5. 从0梳理1场数据挖掘赛事!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:王茂霖,华中科技大学,Datawhale成员 摘要:数据竞赛对于大 ...

  6. 【数据竞赛】从0梳理1场时间序列赛事!

    作者:杰少,南京大学硕士 本文基于 2021 "AI Earth"人工智能创新挑战赛-AI助力精准气象和海洋预测,梳理了时间序列赛事的实践和分析过程,提供了完整baseline方案 ...

  7. 【NLP】从0梳理1场NLP赛事!

    作者:徐美兰-lan,华南理工大学 摘要:这是从0实践竞赛第3篇,数据竞赛对理论实践和增加履历有益,为了让初学者也能入门,本文以全球人工智能技术大赛预热赛-中文预训练模型赛事为背景,梳理了nlp赛事的 ...

  8. 【数据竞赛】从0梳理1场数据挖掘赛事!

    作者:王茂霖,华中科技大学,Datawhale成员 摘要:数据竞赛对于大家理论实践和增加履历帮助比较大,但许多读者反馈不知道如何入门,本文以河北高校数据挖掘邀请赛为背景,完整梳理了从环境准备.数据读取 ...

  9. 基于yolov5-6.0版本的PCB板缺陷检测(Python/C++部署)

    源码下载:https://gitee.com/zhankun3280/my_yolov5-6.0 1.依赖环境 ubuntu 18.04 python 3.6.9 opencv 4.5.0 pytor ...

最新文章

  1. Windows_API_函数 参考大全
  2. t3 修改服务器配置,t3如何修改服务器地址
  3. C# 派生类的构造函数
  4. 数据库-MySQL-配置和管理-用户与授权GRANT
  5. 别再把比特币和区块链划等号了,求求你们了!
  6. sql 查询数据库索引重建_不良的数据库索引– SQL查询性能的杀手–建议
  7. java ztree_ztree简介_动力节点Java学院整理
  8. python如何创建工程预设_如何在sublime3项目设置中设置python模块的搜索路径?ImportError: No module named *的解决办法...
  9. CTO 说了,如果发现谁用 SELECT * 查询直接开除
  10. 第二章、Zigbee模块参数(DRF1609H、DRF2657C)
  11. 我在名牌大学毕业后的经历
  12. 微信小程序红包 php,微信小程序发放红包+领取红包(PHP)
  13. 英语十大词性之一 - 介词
  14. 您需要administrator权限才能对此文件进行更改
  15. php--api发送钉钉消息
  16. scratch算立方根
  17. 农产品追溯管理平台解决方案
  18. LPC23XX CAN波特率的计算
  19. 图像融合之泊松融合,原理讲解及C++代码实现(特别适合新手)
  20. 使用WebStorm的Macros宏指令,实现保存的同时格式化代码,并跳至行尾

热门文章

  1. javaScript 工作必知(三) String .的方法从何而来?
  2. ASP.NET全球化与本地化 c#多国语言的支持 (项目支持多国语言的开发)
  3. Linux学习之系统时间同步
  4. 超级详细的 Python 数据分析指南
  5. 结合Flink,国内自研,大规模实时动态认知图谱平台——AbutionGraph |博文精选
  6. 继AutoML后,第四范式发布软硬一体化AI集成系统SageOne
  7. 受用一生的高效PyCharm使用技巧(二)
  8. 免费报名 | WPS专家教你文本分类在企业中的应用实践
  9. 如何用机器学习方法进行数据建模?(文末福利)
  10. 我能想到最浪漫的七夕,就是让AI唱一首“我爱你”!