目标检测——基于 YOLOv8 实现钢材表面缺陷检测

目录

目标检测——基于 YOLOv8 实现钢材表面缺陷检测

数据集

下载

结构

datasets
  |--NEU-DET
    |--annotations
      |--xx1.xml
    |--images
      |--train
        |--xx1.png
      |--val
        |--xx2.png
    |--labels
      |--train
        |--xx1.txt
      |--val
        |--xx2.txt

转换

  • 从官网获取的数据集的标注文件是 VOC(xml 格式)的,我们需要把它转换成 YOLO(txt 格式)的.
  • 代码:如果数据集格式是严格按照作者博客【用 YOLOv8 解决图像检测】,代码中的路径无需修改;若数据集格式与作者约定的不同,请自行修改路径
import xml.etree.ElementTree as ET
import os
from os import getcwd
from tqdm import tqdm

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_id):
    in_file = 'datasets/NEU-DET/annotations/%s.xml' % (image_id)
    out_file = open('datasets/NEU-DET/labels/train/%s.txt' % (image_id), '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'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


if __name__ == "__main__":
    wd = getcwd()
    print(wd)
    if not os.path.exists('datasets/NEU-DET/labels/'):
        os.makedirs('datasets/NEU-DET/labels/')
    image_ids = os.listdir('datasets/NEU-DET/images/train')
    for image_id in tqdm(image_ids):
        convert_annotation(image_id.split('.')[0])

模型

  • 这是作者训练出的模型:

​ 链接:https://pan.baidu.com/s/1CXjCHtsUMlJgdFrFNEoCMw?pwd=qiaz
​ 提取码:qiaz

### 关于YOLOv8钢材表面缺陷检测中的研究成果 目前,基于YOLOv8钢材表面缺陷检测研究主要集中在提高检测速度、精度以及适应复杂场景的能力上。通过引入先进的深度学习框架和技术优化,研究人员已经取得了一些显著进展。 #### 1. 数据集构建与标注 为了训练高效的目标检测模型,通常需要大量的高质量数据支持。已有研究表明,使用包含至少1800张图像的数据集可以有效提升模型性能[^2]。这些数据集中涵盖了多种类型的钢材表面缺陷,例如轧制氧化皮、斑块、开裂、点蚀表面、内含物以及划痕等。通过对这些样本进行精确标注,能够帮助模型更好地理解不同缺陷特征并加以区分。 #### 2. 模型改进与优化 相比传统的YOLO版本(如YOLOv5),YOLOv8进一步提升了网络结构的设计灵活性和计算效率。它采用了更先进的骨干网架构,并结合了自注意力机制等多种先进技术来增强特征提取能力。这使得即使是在面对复杂的工业环境时也能保持较高的准确性[^3]。 #### 3. 实际应用场景分析 实际应用案例显示,采用YOLOv8开发出来的钢材表面缺陷检测系统不仅具备良好的泛化能力和鲁棒性,而且还能满足实时处理的要求。这种系统的成功实施为企业带来了明显的经济效益和社会效益——既减少了因质量问题引发的安全隐患风险;同时也降低了人力成本投入,提高了整体运营效率[^1]。 #### 4. 存在挑战及未来方向 尽管取得了上述成就,但在某些特定条件下仍面临一定困难。比如当光照条件变化较大或者背景干扰较多的情况下可能会导致漏检或错报现象发生。因此未来的重点研究方向之一就是如何进一步改善算法抗噪性和稳定性,使其更加适用于各种极端工作环境中去[^4]。 ```python import ultralytics from ultralytics import YOLO # 加载预训练模型 model = YOLO('yolov8n.pt') # 使用测试图片进行预测 results = model.predict(source='test_images', save=True, imgsz=640) for result in results: boxes = result.boxes.xyxy.cpu().numpy() # 获取边界框坐标 confidences = result.boxes.conf.cpu().numpy() # 获取置信度分数 class_ids = result.boxes.cls.cpu().numpy() # 获取类别ID ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值