0

0

新人赛 钢铁缺陷检测挑战赛baseline改良方案

P粉084495128

P粉084495128

发布时间:2025-07-24 10:12:58

|

183人浏览过

|

来源于php中文网

原创

本文针对钢铁缺陷检测挑战赛,提出baseline改良方案。将模型由yolov3换为PPYOLO,调整数据增强,改batch_size为16,采用lr预热策略,选ResNet50_vd_ssld作为backbone并调学习率。经训练预测,得分4.9285,较原基线高0.5。还提及后续可用PPYOLOV2、优化数据增强及模型融合进一步提升。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

新人赛 钢铁缺陷检测挑战赛baseline改良方案 - php中文网

新人练习赛 钢铁缺陷检测挑战赛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、将结果写入目标文件

Picsart
Picsart

Picsart是全球最大的数字创作平台。

下载

本次方案

在基线的基础上,更换了目标检测模型,由yolov3更换成了PPYOLO。

减少了原有的数据增强,虽然数据增强可以优化过拟合问题,但是过多的数据增强反而会使得准确率下降。

调整了batch_size值,调整Lr策略增加warmup步骤。

最后得分4.9285,比原作者baseline得分高出了0.5。

新人赛 钢铁缺陷检测挑战赛baseline改良方案 - php中文网        

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)
   

训练集文件

新人赛 钢铁缺陷检测挑战赛baseline改良方案 - php中文网        

验证集文件

新人赛 钢铁缺陷检测挑战赛baseline改良方案 - php中文网        

标签文件

新人赛 钢铁缺陷检测挑战赛baseline改良方案 - php中文网        

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。

另外数据扩增方法一定要反复尝试,会很大程度上影响模型精度,合理选择数据增强方式。

后期上分可使用模型融合。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

574

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

101

2025.10.23

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

381

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2060

2024.08.16

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

42

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

46

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号