yolov5——基于yolov5的钢材表面缺陷识别

2021.8.20
讨论了一下,之前这个结果毋庸置疑是过拟合的。
讲一下为什么之前的结果准确率如此高,我是做了数据增强,做了大量拼接之类的工作,再划分的TRAIN和TEST,但是这样其实TEST里的数据就和TRAIN里的数据在概率上不是独立分布的了,再加上本身也有一定的过拟合,所以训练结果偏好。

这个数据集最大的问题是同类间的差距过大数据量又小,如果直接按照9:1去分训练集和测试集是不行的,很可能那1/10的测试数据形状与9/10的训练数据完全不同,所以会导致结果很差。

建议考虑用西瓜书P27的自助法采集TRAIN和TEST,有空我也试验一下。

另外还是不能使用太大的模型,数据量还是太少了。

2021.7.26修改:
用公司的服务器跑了一个更大的yolov5l模型,300个epoch,只看训练集的话,检测出来的结果看着靠谱多了,虽然有些arc还是歪。只是用l跑这么少的训练集,大概率会过饱和。

他这个map是基于valid集的,想提高分数也要多增加一些valid,由于数据集比较小,每个图像之间的差异较大,实际上很难范化,建议只验证测试集准确率,或者做大量的预处理工作,才能看到效果。
在这里插入图片描述
在这里插入图片描述

1)背景介绍

之前在东大读硕士的时候接触过NEU-DET数据集,用来做钢材表面的缺陷识别,最近学习yolov5想起来了,尝试使用YOLOV5实现识别钢材表面的缺陷。

数据集:http://faculty.neu.edu.cn/yunhyan/NEU_surface_defect_database.html

2) 检测算法YOLOV5

讲算法的文章有很多,就不再复述一遍了。近期学习时主要看到比较好的文章推荐:

YOLO系列(从v1到v5)模型解读 (上、中、下):

https://zhuanlan.zhihu.com/p/183261974
https://zhuanlan.zhihu.com/p/183781646
https://zhuanlan.zhihu.com/p/186014243

Yolov3&Yolov4&Yolov5核心基础知识完整讲解(上、下):

https://zhuanlan.zhihu.com/p/143747206
https://zhuanlan.zhihu.com/p/172121380

之后有空会再整理一篇YOLOV5的学习心得。

3)数据认识

东大钢材缺陷数据中,收集了热轧钢带的六种典型表面缺陷:

rolled-in scale (RS)
patches (Pa)
crazing (Cr)
pitted surface (PS)
inclusion (In)
scratches (Sc)

可视化部分数据:
在这里插入图片描述
可以看出,数据集的类内缺陷在外观上存在很大差异。
例如划痕(Sc)可能是水平划痕,垂直划痕和倾斜划痕等。另外,由于照明和材料变化的影响,类内缺陷图像的灰度是变化的。
简而言之,NEU数据集包括两个困难的挑战,即类内缺陷在外观上存在较大差异,而类间缺陷具有相似的方面。

4)数据处理

数据集的标签为xml格式,需要转换成txt格式,并对数据进行归一化处理,以便yolo算法使用。

转换主要涉及对标定框的归一化以及对类型的归一化。

import xml. etree. ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os. path import join
import glob
classes =["crazing", "inclusion", "patches", "pitted_surface","rolled-in_scale", "scratches"]

def convert(size, box):
    dw=1./size[0]
    dh =1./size[1]
    x = (box[0] + box[1]) / 2.0
    y=(box[2]+box[3])/2.0
    w=box[1] -box[0]
    h = box[3] - box[2]
    x=x*dw
    w=w*dw
    y= y*dh
    h =h*dh
    return(x,y,w,h)

def convert_annotation(image_name):
    in_file=open('./aragnal/ANNOTATIONS/'+image_name[: -3]+'xmL')
    out_file=open( "D:/python/kaggle/yolov5-master/NEU-DET/valid/labels/"+image_name[: -3]+'txt', 'w')
    tree=ET. parse(in_file)
    root=tree. getroot()
    size=root.find('size')
    w=int(size.find('width').text)
    h=int(size. find( 'height'). text)
    for obj in root.iter('object'):
        cls=obj. find('name').text
        if cls not in classes:
            print(cls)
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text),
            float(xmlbox.find('xmax').text),
            float(xmlbox.find('xmin').text),
            float(xmlbox.find('xmax').text))
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb])+'\n')

wd = getcwd()

if __name__ == '__main__':
    for image_path in glob.glob(r"D:\python\kaggle\yolov5-master\NEU-DET\valid\images\*.jpg"):
        image_name = image_path.split('\\')[-1]
    # print (imege path)
        convert_annotation(image_name)

运行结果如下:
在这里插入图片描述

5 )调整参数

train.py配置参数如下:
–batch-size
8
–epoch
300
–data
D:\python\yolov5-master\NEU-DET\data.yaml
–cfg
D:\python\yolov5-master\yolov5-master\models\yolov5s.yaml
–weight
D:\python\yolov5-master\yolov5-master\runs\train\exp7\weights\best.pt

路径可以采用绝对路径也可以采用相对路径,这里采用了绝对路径。
batch-size与显卡显存相关,超出显存会报错。本次采用1080Ti,设置了8.
epoch设置为300次。

6)结果预测

train.py训练集运行结果:
在这里插入图片描述
PR结果很差,一方面时由于机器不太行,epoch跑的太少导致的训练不充分欠拟合,另一方面应该也和数据集类间相似度较低有关。YOLOV5针对COCO训练集最哦的我数据增强措施可能并不完全适合这个项目,需要额外的数据增强措施,在下一篇博客里再讨论优化过程。

detect.py预测参数如下:
–source
D:\python\yolov5-master\NEU-DET\train\images
–weights
D:\python\yolov5-master\yolov5-master\runs\train\exp8\weights\best.pt
–conf
0.3

detcect结果如下 :在这里插入图片描述

7)经验总结

1、如果第一次训练识别到的结果比人眼识别的差得多,那么最可能的原因是在数据图像预处理方面有问题。
2、YoloV5有多种型号(yolov5s、yolov5m、yolov5l、yolov5x),分别对应衣服码数s m l x,不要只选择最大的一个,要根据你穿的衣服码数进行选择(开玩笑),实际原因是盲目选择过大的可能会过拟合,尤其像这种数据量不大的项目。
3、由于数据集较少,考虑做迁移学习,但是YOLOV5怎么冻结部分权重还没太搞明白。

8)改进

本次数据集的难度主要体现在类间差距不够明显以及类内差距过大上,针对上述0.45的mAP做了如下改进,最后mAP增加到了0.61:
(最近有点忙,以后再开一个博客详细写)
1、有的裂缝由于钢材是细长的原因都集中在一个方向,而划痕哪个方向都有,这俩类间比较相似,所以容易特定方向划痕被识别错误为裂缝,因此增加了裂缝的数据增强(自己与自己旋转拼接等)
2、由于图像主要呈现rgb的g 所以其他两个增强增加的泛化能力并没有意义 因此删除了这方面的增强(也有增加运算速度的作用)
3、类间差距过大,数据增强需要单独考虑,比如划痕这种就是倾向于每个图出现数次,因此可以考虑将划痕多做拼接操作。
4、在做拼接操作的时候不能把数据想象成人去做,比如斑块这个训练类别,拼接时会使得斑块拼接到一起形成新的板块,这样分别按照两个斑块去做数据框就不准了(下图如果上下拼接就是这种情况)
在这里插入图片描述

  • 40
    点赞
  • 363
    收藏
    觉得还不错? 一键收藏
  • 43
    评论
### 回答1: 抱歉,我没有直接提供钢材表面缺陷检测系统源代码的能力。不过,您可以在网上搜索钢材表面缺陷检测系统,然后找到基于 YOLOv5 的开源项目,从而获取源代码。您也可以向开源社区寻求帮助,或者在网上请教其他相关专家。希望我的回答对您有所帮助。 ### 回答2: 基于yolov5钢材表面缺陷检测系统源码是一种用于检测钢材表面缺陷的计算机视觉系统。该系统使用yolov5目标检测算法作为基础,并针对钢材表面缺陷进行了优化和训练。 这个系统的源码包含了建立和训练模型所需的代码和数据集。首先,源码包含了数据预处理部分,可以将原始的钢材表面图片进行清洗和标注,生成训练所需的数据集。然后,源码还包含了模型的构建和训练过程,其中使用了yolov5的网络结构和损失函数,并对该模型进行了特定的调整和优化,以适应钢材表面缺陷检测的需要。训练过程中,可以使用GPU加速,以提高训练速度。 在系统训练完成后,源码还提供了测试和部署的代码。测试部分可以对训练好的模型进行精度评估和性能测试,以验证模型的准确性和鲁棒性。部署部分可以将训练好的模型应用到实际的钢材表面缺陷检测中,包括读取图像、预测缺陷位置和类型,并输出结果。 总的来说,基于yolov5钢材表面缺陷检测系统源码提供了一种方便、高效、准确的解决方案,能够在工业领域中应用于钢材表面缺陷的自动检测和分类,提升生产效率和产品质量。 ### 回答3: 基于YOLOv5钢材表面缺陷检测系统源码是一个利用YOLOv5目标检测模型来识别钢材表面缺陷的程序代码。YOLOv5是一种快速而精准的目标检测算法,能够在实时性和准确性之间取得平衡,适用于工业场景中的缺陷检测。 该系统源码主要包括以下几个方面的内容: 1. 数据集准备:针对钢材表面缺陷进行数据采集和标注,生成用于模型训练的数据集。这些数据集需要包含正常和缺陷样本的图像,并对其进行标注,标记出缺陷的位置和类型。 2. 模型构建:基于YOLOv5的网络结构,创建模型架构,并进行相应的配置。这里需要定义模型的输入输出尺寸、损失函数、优化器等,并选择合适的超参数。 3. 模型训练:使用数据集训练模型,通过反向传播算法更新模型的权重和偏置,使其能够准确地检测出钢材表面的各种缺陷。训练过程需要进行多轮迭代,直到模型收敛并达到较好的检测效果。 4. 模型评估:使用测试集对训练好的模型进行评估,计算模型在准确率、召回率等指标上的表现。通过评估结果可以了解模型的性能,并进行必要的调整和优化。 5. 模型应用:将训练好的模型部署到实际的钢材缺陷检测系统中,实时地对钢材表面进行缺陷检测。在检测过程中,模型通过分析输入图像中的物体边界框和类别预测,确定钢材表面是否存在缺陷,并给出相应的缺陷类型和位置信息。 基于YOLOv5钢材表面缺陷检测系统源码能够提供高效、准确的检测功能,为工业生产中的质量控制和缺陷修复提供了有效的支持。通过自动化的缺陷检测,可以提高生产效率,减少人力成本,并提供了更精确、可靠的判断依据,确保生产过程中的质量和安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值