YOLOv8实现热轧带钢表面缺陷目标检测(附代码和数据集)

1.数据集

NEU-DET数据集收集了六种典型的热轧带钢表面缺陷,即:

  • 轧制鳞片(Rolled-in_scale)
  • 斑块(Patches)
  • 裂纹(Crazing)
  • 坑洼面(Pitted_surface)
  • 夹杂(Inclusion)
  • 划痕(Scratches)

数据库包括1800张灰度图像,6种不同的典型表面缺陷样本各300个。数据集中images文件存放的是jpg格式的缺陷图片,annatation中存放的是缺陷图片对应的标注为xml格式文件,包括缺陷的类型、位置和大小等信息。

使用YOLOv8进行缺陷检测,需要的数据集格式为txt。因此需要把xml格式转为txt格式,转换代码:(注意:需要提前在train文件夹和test文件夹中分别创建labels命名的文件夹)

import os
import xml.etree.ElementTree as ET


def convert_xml_to_yolo(xml_file, classes, output_folder):
    tree = ET.parse(xml_file)
    root = tree.getroot()

    image_filename = root.find('filename').text
    image_width = int(root.find('size').find('width').text)
    image_height = int(root.find('size').find('height').text)

    yolo_labels = []

    for obj in root.findall('object'):
        class_name = obj.find('name').text
        if class_name not in classes:
            continue

        class_id = classes.index(class_name)
        bbox = obj.find('bndbox')

        x_center = (int(bbox.find('xmin').text) + int(bbox.find('xmax').text)) / 2 / image_width
        y_center = (int(bbox.find('ymin').text) + int(bbox.find('ymax').text)) / 2 / image_height
        w = (int(bbox.find('xmax').text) - int(bbox.find('xmin').text)) / image_width
        h = (int(bbox.find('ymax').text) - int(bbox.find('ymin').text)) / image_height

        yolo_labels.append(f"{class_id} {x_center} {y_center} {w} {h}")

    output_path = os.path.join(output_folder, os.path.splitext(image_filename)[0] + ".txt")

    with open(output_path, 'w') as out_file:
        for line in yolo_labels:
            out_file.write(line + '\n')

# Define your classes
classes = ['crazing', 'inclusion', 'patches', 'pitted_surface', 'rolled-in_scale', 'scratches']  # Add your own class names

# Path to the directory containing XML files
train_xml_dir = 'D:/pycharm code/ultralytics-main/data/NEU-DET/train/annatation'
train_output_dir = 'D:/pycharm code/ultralytics-main/data/NEU-DET/train/labels'  # Output directory for YOLO format files

test_xml_dir = 'D:/pycharm code/ultralytics-main/data/NEU-DET/test/annatation'
test_output_dir = 'D:/pycharm code/ultralytics-main/data/NEU-DET/test/labels'  # Output directory for YOLO format files

# Create the output directory if it doesn't exist
os.makedirs(train_output_dir , exist_ok=True)
os.makedirs(test_output_dir, exist_ok=True)

# Convert all XML files to YOLO format and save to the output directory
for xml_file in os.listdir(train_xml_dir ):
    if xml_file.endswith('.xml'):
        xml_path = os.path.join(xml_dir, xml_file)
        convert_xml_to_yolo(xml_path, classes, train_output_dir )
# 测试集
for xml_file in os.listdir(test_xml_dir):
    if xml_file.endswith('.xml'):
        xml_path = os.path.join(test_xml_dir, xml_file)
        convert_xml_to_yolo(xml_path, classes, test_output_dir)

2.下载预训练模型

(1)下载yolov8n训练模型,下载地址如下:

https://github.com/ultralytics/ultralyticsicon-default.png?t=N7T8https://github.com/ultralytics/ultralytics

(n、s、m、l、x五种不同规模的预训练模型选择一个即可),放到ultralytics-main目录下即可。

(2)创建yaml模型文件

在自己创建的data文件夹中,创建data.yaml文件,存放自己的训练集和测试集地址,检测项目类别数,检测项目类别:(对于本数据集共有6中类别,因此nc:6。)(种类名称放到names:)

(3)找到YOLO v8\ultralytics-main\ultralytics/yolo/cfg文件路径下的default.yaml文件复制到自己数据集目录下并打开进行如下修改:

  • task设置为detect;
  • mode设置为train;
  • model后设置为预训练模型yolov8l.pt的文件路径;(我下载的yolov8l.pt文件)
  • data后设置为(2)中所述的data.yaml文件的绝对路径;
  • epoch设置为自己所需的训练轮数;
  • batch根据自己电脑配置进行设置。

(4)开始训练,在终端中输入以下命令回车,即可开始训练:

yolo cfg=dataSets/NEU-DET/default.yaml

训练过程如下:

(5) 进行predict预测

  1. 将default.yaml文件中mode改为predict。
  2. 将model由预训练模型更改为自己训练后的最优模型best.pt的绝对路径。
  3. 将source改为待预测图片所在文件夹的路径。
  4. 在终端中输入以下命令回车,即可开始预测:

    yolo cfg=dataSets/NEU-DET/default.yaml

运行预测完毕后可以看到每张图片的预测结果和最终的预测结果保存路径如下,也可以直接预测视频:

预测推理结果如下: 

有问题咨询qq:498609554 

微信:

以下是一个简单的C++程序,用于热轧带钢表面缺陷的分类检测。该程序使用OpenCV库进行图像处理和分析,可以检测出带钢表面缺陷并进行分类。 ```cpp #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { // 读取原始图像 Mat img = imread("steel.jpg"); if (img.empty()) { cout << "无法读取图像文件" << endl; return -1; } // 灰度化图像 Mat gray; cvtColor(img, gray, COLOR_BGR2GRAY); // 对图像进行高斯滤波 Mat blur; GaussianBlur(gray, blur, Size(5, 5), 0); // 对图像进行二值化处理 Mat binary; threshold(blur, binary, 100, 255, THRESH_BINARY); // 进行轮廓检测 vector<vector<Point>> contours; findContours(binary, contours, RETR_TREE, CHAIN_APPROX_SIMPLE); // 对每个轮廓进行分析和分类 for (size_t i = 0; i < contours.size(); i++) { // 计算轮廓的面积 double area = contourArea(contours[i]); // 判断缺陷类型 if (area > 10000) { cout << "表面缺陷类型为: 大面积缺陷" << endl; } else if (area > 1000) { cout << "表面缺陷类型为: 中等面积缺陷" << endl; } else { cout << "表面缺陷类型为: 小面积缺陷" << endl; } } return 0; } ``` 该程序实现了以下功能: 1. 读取原始图像; 2. 对图像进行灰度化处理; 3. 对图像进行高斯滤波; 4. 对图像进行二值化处理; 5. 进行轮廓检测; 6. 对每个轮廓进行分析和分类。 具体而言,该程序使用了OpenCV库中的各种函数来对图像进行处理和分析。首先,使用`imread()`函数读取原始图像,然后使用`cvtColor()`函数将图像从BGR格式转换为灰度格式。接着,使用`GaussianBlur()`函数对图像进行高斯滤波,以去除噪声。然后,使用`threshold()`函数对图像进行二值化处理,以便进行轮廓检测。使用`findContours()`函数进行轮廓检测,并使用`contourArea()`函数计算每个轮廓的面积。最后,根据面积大小判断缺陷类型,并输出结果。 需要注意的是,这只是一个简单的示例程序,实际的热轧带钢表面缺陷检测算法可能会更加复杂和精细。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzdjlu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值