新人赛 钢铁缺陷检测挑战赛baseline改良方案
本文针对钢铁缺陷检测挑战赛,提出baseline改良方案。将模型由yolov3换为PPYOLO,调整数据增强,改batch_size为16,采用lr预热策略,选ResNet50_vd_ssld作为backbone并调学习率。经训练预测,得分4.9285,较原基线高0.5。还提及后续可用PPYOLOV2、优化数据增强及模型融合进一步提升。
新人练习赛 钢铁缺陷检测挑战赛baseline改良方案
赛事简介
赛题介绍
本次比赛为图像目标识别比赛,要求参赛选手基于给定图像建立模型,识别出钢铁表面出现缺陷的位置,并给出锚点框的坐标,同时对不同的缺陷进行分类。
数据简介
本数据集来自NEU表面缺陷检测数据集,收集了6种典型的热轧带钢表面缺陷,即氧化铁皮压入(RS)、斑块(Pa)、开裂(Cr)、点蚀(PS)、夹杂(In)和划痕(Sc)。
提交内容及格式
结果文件命名:submission.csv(否则无法成功提交) 结果文件格式:.csv(否则无法成功提交) 结果文件内容:submission.csv结果文件需包含多行记录,每行包括4个字段,内容示例如下
| image_id | bbox | category_id | confidence |
|---|---|---|---|
| 1400 | [0, 0, 0, 0] | 0 | 1 |
各字段含义如下:
image_id(int): 图片id
bbox(list[float]): 检测框坐标(XMin, YMin, XMax, YMax)
category_id: 缺陷所属类别(int),类别对应字典为:{‘ crazing’:0,’inclusion’:1, ’pitted_surface’:2, ,’scratches’:3,’patches’:4,’rolled-in_scale’:5}
confidence(float): 置信度
备注: 每一行记录1个检测框,并给出对应的category_id;同张图片中检测到的多个检测框,需分别记录在不同的行内。
本次方案是参考原作者提出baseline:https://aistudio.baidu.com/aistudio/projectdetail/2319492
本文真正的应用PaddleX的代码非常简单,并且新手友好!
根据官方文档,所有的PaddleX都由三步组成:
| 步骤 | 说明 | |
|---|---|---|
| 第1步 | 定义transforms | 用于定义模型训练、验证、预测过程中,输入图像的预处理和数据增强操作 |
| 第2步 | 定义datasets | 用于定义模型要加载的训练、验证数据集 |
| 第3步 | 定义模型开始训练 | 选择需要的模型,进行训练 |
本次执行过程可分为:
1、安装需要的PaddleX版本
2、解压数据
3、分割数据集
4、引入包并设为GPU训练
5、定义图像处理流程transforms
6、定义数据集Dataset
7、正式训练
8、进行预测
9、将结果写入目标文件
本次方案
在基线的基础上,更换了目标检测模型,由yolov3更换成了PPYOLO。
减少了原有的数据增强,虽然数据增强可以优化过拟合问题,但是过多的数据增强反而会使得准确率下降。
调整了batch_size值,调整Lr策略增加warmup步骤。
最后得分4.9285,比原作者baseline得分高出了0.5。
1、安装需要的PaddleX版本
In [1]
# 安装paddlex# 需要注意paddlex1对于版本有所要求,所以最好更新对应的包版本!pip install "numpy<=1.19.5" -i https://mirror.baidu.com/pypi/simple !pip install "paddlex<2.0.0" -i https://mirror.baidu.com/pypi/simple
2、解压数据
数据集已经直接被放在./work/目录下,直接解压即可
In [ ]
# 解压文件并移除多余的目录! unzip work/train.zip -d ./work/ ! rm -f -r work/__MACOSX ! unzip work/test.zip -d ./work/ ! rm -f -r work/__MACOSX
3、按比例分割数据集
按比例9:1分割数据集
(PS:原作者是8:2分割数据集)
In [ ]
import os# 遍历训练集name = [name for name in os.listdir('work/train/IMAGES') if name.endswith('.jpg')]
train_name_list=[]for i in name:
tmp = os.path.splitext(i)
train_name_list.append(tmp[0])# 构造图片-xml的链接文件ori_train.txtwith open("./work/train/ori_train.txt","w") as f: for i in range(len(train_name_list)): if i!=0: f.write('\n')
line='IMAGES/'+train_name_list[i]+'.jpg'+" "+"ANNOTATIONS/"+train_name_list[i]+'.xml'
f.write(line)# 构造label.txtlabels=['crazing','inclusion','pitted_surface','scratches','patches','rolled-in_scale']with open("./work/train/labels.txt","w") as f: for i in range(len(labels)):
line=labels[i]+'\n'
f.write(line)# 将ori_train.txt随机按照eval_percent分为验证集文件和训练集文件# eval_percent 验证集所占的百分比import random
eval_percent=0.1;
data=[]with open("work/train/ori_train.txt", "r") as f: for line in f.readlines():
line = line.strip('\n')
data.append(line)
index=list(range(len(data)))
random.shuffle(index)# 构造验证集文件cut_point=int(eval_percent*len(data))with open("./work/train/val_list.txt","w") as f: for i in range(cut_point): if i!=0: f.write('\n')
line=data[index[i]]
f.write(line)# 构造训练集文件with open("./work/train/train_list.txt","w") as f: for i in range(cut_point,len(data)): if i!=cut_point: f.write('\n')
line=data[index[i]]
f.write(line)
训练集文件
验证集文件
标签文件
4、引入包并设为GPU训练
引入包并设为GPU训练,如果没有GPU则使用CPU训练
In [2]
import matplotlib
matplotlib.use('Agg')
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'import paddlex as pdx
5、定义图像处理流程transforms
In [3]
from paddlex.det import transforms
train_transforms = transforms.Compose([
transforms.MixupImage(mixup_epoch=250),
transforms.RandomDistort(),
transforms.RandomExpand(),
transforms.RandomCrop(),
transforms.Resize(target_size=608, interp='RANDOM'),
transforms.RandomHorizontalFlip(),
transforms.Normalize(),
])
eval_transforms = transforms.Compose([
transforms.Resize(target_size=608, interp='CUBIC'),
transforms.Normalize(),
])
6、定义数据集Dataset
In [4]
train_dataset = pdx.datasets.VOCDetection(
data_dir='work/train',
file_list='work/train/train_list.txt',
label_list='work/train/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(
data_dir='work/train',
file_list='work/train/val_list.txt',
label_list='work/train/labels.txt',
transforms=eval_transforms)
7、正式训练
本次方案采取了pdx.det.PPYOLO方案,并且batch_size设为16,加快训练的速度。还有采取lr预热warmup策略。PPYOLO的backbone选为ResNet50_vd_ssld,并且对学习率进行了调整。经过以上的调整,最后得分为4.9285,比原作者的4.49872,高出了约0.5。证明此方案可行。
In [5]
num_classes = len(train_dataset.labels)
model = pdx.det.PPYOLO(num_classes=num_classes, backbone='ResNet50_vd_ssld')
model.train(
num_epochs=300,
train_dataset=train_dataset,
train_batch_size=16,
eval_dataset=eval_dataset,
learning_rate=0.000125,
warmup_steps=1000,
warmup_start_lr=0.0,
lr_decay_epochs=[210,240],
save_interval_epochs=10,
save_dir='output/ppyolo_ResNet50_vd_ssld',
use_vdl=True)
8、 进行预测
遍历文件夹获得需要检测的图片列表
test数据是在之前和train数据一起解压的,这里就直接遍历文件夹即可~
如果有小伙伴为了保护存储器删除了数据,还请重新解压一次~如果一路运行下来什么都没进行操作就直接运行就可以了~
In [6]
import os
name = [name for name in os.listdir('work/test/IMAGES') if name.endswith('.jpg')]
test_name_list=[]for i in name:
tmp = os.path.splitext(i)
test_name_list.append(tmp[0])
进行检测
模型预测结果为: [{'category_id': int64, 'bbox': float:[x,y,x_length,y_length], 'score': float, 'category': str},
其中,category_id是编号,bbox是锚框,score是置信度,category是类别名称。需要注意bbox的格式和题目中格式不同,这里分别表明了框的左下角坐标,以及长宽长
度,题目要求为左下角坐标和右上角坐标;这里的编号和题目中编号并不对应,所以需要根据类别信息进行转化。
In [7]
import paddlex as pdx# 读取模型model = pdx.load_model('output/ppyolo_ResNet50_vd_ssld/best_model')# 建立一个标号和题目要求的id的映射num2index={'crazing':0,'inclusion':1,'pitted_surface':2,'scratches':3,'patches':4,'rolled-in_scale':5}
result_list = []# 将置信度较好的框写入result_listfor index in test_name_list:
image_name = 'work/test/IMAGES/'+index+'.jpg'
predicts = model.predict(image_name) for predict in predicts: if predict['score']<0.5: continue; # 将bbox转化为题目中要求的格式
tmp=predict['bbox']
tmp[2]+=tmp[0]
tmp[3]+=tmp[1]
line=[index,tmp,num2index[predict['category']],predict['score']]
result_list.append(line)
9、将结果写入目标文件
将上述list转化为csv就可以直接提交了!
In [8]
import numpy as np
result_array = np.array(result_list)import pandas as pd
df = pd.DataFrame(result_array,columns=['image_id','bbox','category_id','confidence'])
df.to_csv('submission.csv',index=None)
10、总结
针对目标检测比赛,大家在选定了一个baseline之后可以尝试各种技巧,包括学习率调整策略,模型调参等等。关于目标检测竞赛的一些技巧,大家可以去网上搜索相关的trick。
改进方案:
可使用精度更好的模型,例如PPYOLOV2。
另外数据扩增方法一定要反复尝试,会很大程度上影响模型精度,合理选择数据增强方式。
后期上分可使用模型融合。
以上就是新人赛 钢铁缺陷检测挑战赛baseline改良方案的详细内容,更多请关注深圳推广【www.sztg.com.cn】。
如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!
猜您喜欢
5大经典IP跨界集结!KK平台“GG全能王挑战赛2026”重磅开启
2026-06-11曾经的网吧五连坐,那些陪伴我们走过青春岁月的游戏,你还记得吗? 属于我们这代人的“电竞全明星”来了! 不再是单一项目的孤军奋战,而是一场打破界限、前所未有的【全明星跨界娱乐赛】—— GG全能王挑战赛2026,将于6月11日(本周四)晚19:00正式拉开帷幕! 最熟悉的巅峰阵容,最纯粹的经典碰撞与热血重燃。魔兽、DotA、CS1.6、星际、97……谁说经典老游戏没有自己的全明星?今天,那些存在于你青...
三角洲行动s9烽火挑战赛新手攻略
2026-06-07《三角洲行动》是一款设定在2035年的第一人称特战干员战术射击游戏。S9烽火挑战赛消耗挑战券入场,那么有不少小伙伴好奇烽火挑战赛新手怎么玩,下面就来告诉大家s9烽火挑战赛新手攻略。 三角洲行动s9烽火挑战赛新手攻略 S9新上线的烽火挑战赛想必不少玩家已经试水,7轮闯关玩法可玩性拉满,实测肝完两天吃透全套玩法逻辑。 核心通关口诀:争夺曼德尔砖、保全破译灯、压低阵亡次数。 该模式对局数据独立结算,不计...
2026 GG全能王挑战赛震撼开启!五大经典IP巅峰对决,传奇阵容由你决定!
2026-05-27青春不老,热血重燃!魔兽经典对战、DotA、星际争霸、CS1.6、经典97……那些陪伴我们无数个日夜的五大殿堂级游戏,今日在KK官方对战平台集结! “2026 GG全能王挑战赛”全面升级!20位各路达人破圈碰撞,4支跨界战队即将诞生,全能王者的加冕之路,由你来铺就!谁能胜任明星队长?评选结束后,最终胜出的4位队长将开启竞拍选人直播,高燃博弈抢夺心仪队员!你的每一票、每一个评分,都将直接决定最终战队...
Now冥想手机版如何设置加入个人挑战赛
2026-05-19在now冥想手机版中,参与个人挑战赛能为你的正念练习注入新鲜感与持续动力。接下来,我们将为你清晰呈现加入个人挑战赛的具体操作步骤。 首先,启动Now冥想手机版应用。进入首页后,你将看到布局简洁、功能齐全的主界面。 随后,在底部导航栏或首页显眼位置找到并点击“挑战”入口,进入挑战专区。这里汇聚了形式多样、主题丰富的挑战活动,涵盖不同难度与周期。 挑选适合自己的个人挑战赛前,请务必查看每项挑战的详细说...
真正的“老头杯”来了!7万奖金寻魔兽、CS路人王,KK官方对战平台2026GG全能王挑战赛重磅回归!
2026-05-02兄弟们,都让让!属于经典游戏的“老头杯”终于回来了! KK官方对战平台大型经典游戏娱乐赛事——GoldenGames全能王挑战赛(GG全能王)2026年全面升级,重磅回归! 没有繁琐的门槛,只有最纯粹的竞技与兄弟情怀。这一次,我们将集结电竞圈的半壁江山,带你重温当年网吧连坐的热血青春! 爆点一:全明星阵容集结,经典五项神仙打架 本次赛事由SKY(李晓峰)、ALEX(卞正伟)等中国电竞传奇领衔“全明...
《一念逍遥》十方萌兽挑战赛介绍
2026-05-02一念逍遥十方萌兽挑战赛怎么玩?最近《一念逍遥》里有个活动挺值得关注的,就是十方萌兽新大区开启之后,推出的限定灵兽挑战赛。今天小编就带来一念逍遥十方萌兽挑战赛介绍。活动时间不算长,从4月24日开始一直到5月5日结束,也就差不多两周不到的时间。参与资格有一点限制,只有新大区前16位面的仙友,才能报名参加。所以如果你刚进了新大区,还没搞清楚,自己算不算在这个范围里的话,最好先确认一下自己的位面编号,免得...
张颂文谈AI能否取代演员:AI很完美 但人因有缺陷才更真实
2026-04-22日前,曾出演《狂飙》等影视剧、著名演员张颂文在出席电影业高质量发展分论坛时,谈到“演员能否被AI取代”争议。 张颂文提到,AI技术这样的发展情况下,会不会有一天演员这个行业就不存在了,AI那么完美,它真的是无所不能吗? 他坦言说:“AI可能很完美,但人类因自身缺陷而变得更真实,人类本身的真实无法被AI取代。” 近日,爱奇艺在世界大会上宣布已经获得超100位位艺人的AI授权,AI艺人库的出现引发全网...
禅道怎么查看Bug趋势图_禅道缺陷趋势统计教程【实测】
2026-04-13若无法直观掌握缺陷随时间波动规律,需启用趋势分析视图:一、用禅道“质量→缺陷统计→趋势图”,按日期筛选并渲染折线图;二、直查数据库执行SQL聚合后用Python清洗导出CSV绘图;三、导出Bug数据至Excel,用透视表按openedDate分组计数并生成折线图。 如果您在禅道中已积累大量缺陷数据,但无法直观掌握各项目缺陷随时间变化的波动规律,则可能是由于未启用或未正确配置趋势分析视图。以下是实现...
Python中哪些操作会触发SystemError_排查解释器内部状态错误与C代码缺陷
2026-04-13SystemError表明CPython解释器内部状态损坏,通常由C扩展缺陷、内存误操作或GC异常引发,而非Python代码逻辑错误;需通过错误栈定位C函数或模块,启用-Xdev增强诊断。 SystemError通常意味着CPython解释器内部状态已损坏 遇到SystemError基本可以判定:不是你的Python代码逻辑错了,而是解释器在执行过程中发现了不一致的内部状态(比如对象引用计数异常、...
YOLO+OpenClaw+AIGC缺陷生成:破解工业检测“数据荒”的低代码方案
2026-04-10yolo+openclaw+aigc缺陷生成:破解工业检测“数据荒”的低代码方案 大家好,我是ai小怪兽。上周一位做汽车零部件质检的读者给我发来一段语音,声音里带着无奈:“小怪兽,我们想用yolo做表面缺陷检测,但良品率98%,缺陷样本太少了。偶尔出现一个划痕,还是那种很轻微的,模型根本没见过严重的缺陷长什么样。现在检测效果一塌糊涂。” 这几乎是所有工业质检项目的共同困境:缺陷难收集,种类不平衡,...
