基于YOLOv8的缺陷检测任务模型训练

news2024/11/15 19:25:34

在这里插入图片描述

文章目录

  • 一、引言
  • 二、环境说明
  • 三、缺陷检测任务模型训练详解
    • 3.1 PCB数据集
      • 3.1.1 数据集简介
      • 3.1.2 数据集下载
      • 3.1.3 构建yolo格式的数据集
    • 3.2 基于ultralytics训练YOLOv8
      • 3.2.1 安装依赖包
      • 3.2.2 ultralytics的训练规范说明
      • 3.2.3 创建训练配置文件
      • 3.2.4 下载预训练模型
      • 3.2.5 训练模型
      • 3.2.6 训练结果
  • 四、基于YOLO8的PCB缺陷检测系统

一、引言

  • 在当今快速发展的工业生产领域,自动化和智能化已成为提高生产效率和产品质量的关键因素。缺陷检测作为智能制造的重要组成部分,对于确保产品质量和降低生产成本具有重要意义。
  • 随着计算机视觉技术的不断进步,基于深度学习的对象检测算法,尤其是YOLO(You Only Look Once)系列算法,因其速度快、精度高而在工业缺陷检测中得到了广泛应用。YOLOv8作为该系列的最新版本之一,以其更高效的网络结构和更准确的检测性能,为缺陷检测任务带来了新的突破。
  • 本文将深入探讨基于YOLOv8的缺陷检测任务训练过程,从数据准备、模型训练到性能评估,全面解析如何利用这一先进技术提升工业缺陷检测的自动化水平。通过实际案例分析,本文旨在为相关领域的研究者和工程师提供实用的技术参考和指导。

注意:学习本文的训练过程需要相关的前置知识,如有需要可参考文章:Python基础(千锋篇)专栏介绍、 Jupyter Notebook

二、环境说明

  1. 本文介绍的训练过程,使用ModelScope提供的Notebook的线上环境。分为CPU环境/GPU环境,均可使用。

ModelScope–我的Notebook

在这里插入图片描述
2. 本文的YOLOv8的训练过程,使用了ultralytics的训练技术方案。相关文档可参考:https://docs.ultralytics.com/modes/train/

三、缺陷检测任务模型训练详解

完整代码资源:https://download.csdn.net/download/weixin_44063529/89645813

3.1 PCB数据集

3.1.1 数据集简介

PCB缺陷检测数据集:印刷电路板(PCB)瑕疵数据集由北京大学发布,其中包含1386张图像以及6种缺陷(缺失孔,鼠标咬伤,开路,短路,杂散,伪铜),用于检测,分类和配准任务。我们选取了其中适用与检测任务的693张图像,下载内容包括JSON和VOC格式版。

3.1.2 数据集下载

!git lfs install
!git clone https://www.modelscope.cn/datasets/ModelBulider/PCB_DATASET_JSON.git

!tar -xvf ./PCB_DATASET_JSON/PCB_DATASET_JSON.tar

3.1.3 构建yolo格式的数据集

  1. 创建训练集与测试集的标签文件
import json
import os

def refactor_data_format(json_path, yolo_paths):
    with open(json_path) as f:
        data = json.load(f)

    imgs = {}
    for img in data['images']:
        imgs[img['id']] = {
            'h': img['height'],
            'w': img['width'],
            'file_name': img['file_name'],
        }


    tmp = ''
    for anno in data['annotations']:
        print(imgs[anno['image_id']]['file_name'])
        txt_path = os.path.join(yolo_paths, imgs[anno['image_id']]['file_name'].split('.')[0] + '.txt')
        with open(txt_path, 'w') as txt_file:
            if imgs[anno['image_id']] != tmp:
                # xywh --> xywh(归一化)
                bbox = [anno['bbox'][0] / imgs[anno['image_id']]['w'],
                        anno['bbox'][1] / imgs[anno['image_id']]['h'],
                        anno['bbox'][2] / imgs[anno['image_id']]['w'],
                            anno['bbox'][3] / imgs[anno['image_id']]['h']]

                cls_id = anno['category_id'] - 1
                # 保存
                txt_file.write(str(cls_id) + ' ' +" ".join([str(a) for a in bbox])+"\n")  # 生成格式0 cx,cy,w,h
                tmp = imgs[anno['image_id']]

            else:
                # xywh --> xywh(归一化)
                bbox = [anno['bbox'][0] / imgs[anno['image_id']]['w'],
                        anno['bbox'][1] / imgs[anno['image_id']]['h'],
                        anno['bbox'][2] / imgs[anno['image_id']]['w'],
                            anno['bbox'][3] / imgs[anno['image_id']]['h']]

                cls_id = anno['category_id'] - 1
                # 保存
                txt_file.write(str(cls_id) + ' ' +" ".join([str(a) for a in bbox])+"\n")  # 生成格式0 cx,cy,w,h    

# 生成训练与测试的label文件(.txt)
train_json_path = "./PCB_DATASET/Annotations/train.json"
train_yolo_paths = "./datasets/PCB_DATASET/labels/train2024"

val_json_path = "./PCB_DATASET/Annotations/val.json"
val_yolo_paths = "./datasets/PCB_DATASET/labels/val2024"

if not os.path.exists(train_yolo_paths):
    os.makedirs(train_yolo_paths)

if not os.path.exists(val_yolo_paths):
    os.makedirs(val_yolo_paths)

refactor_data_format(train_json_path, train_yolo_paths)
refactor_data_format(val_json_path, val_yolo_paths)
  1. 创建训练集与测试集的数据集
import os
import shutil

Images_path = r'./PCB_DATASET/images'  # 源图路径

train_labels = r'./datasets/PCB_DATASET/labels/train2024'  # train标签路径
val_labels = r'./datasets/PCB_DATASET/labels/val2024'  # val标签路径

train_images = r'./datasets/PCB_DATASET/images/train2024'  # 保存train图像路径
val_images = r'./datasets/PCB_DATASET/images/val2024'  # 保存val图像路径

if not os.path.exists(train_images):
    os.makedirs(train_images)

if not os.path.exists(val_images):
    os.makedirs(val_images)

# 判断文件夹是否存在,不存在即创建
if not os.path.exists(train_images):
    os.mkdir(train_images)
if not os.path.exists(val_images):
    os.mkdir(val_images)


# 按照标签名移动对应图像
for label_name in os.listdir(train_labels):
    img_name = label_name[:-3] + 'jpg'
    shutil.move(os.path.join(Images_path, img_name), os.path.join(train_images, img_name))


for label_name in os.listdir(val_labels):
    img_name = label_name[:-3] + 'jpg'
    shutil.move(os.path.join(Images_path, img_name), os.path.join(val_images, img_name))


3.2 基于ultralytics训练YOLOv8

3.2.1 安装依赖包

!pip install ultralytics

3.2.2 ultralytics的训练规范说明

  1. YOLO训练标签示例如下(转换目标):
类别id 归一化后框中心点x坐标 归一化后框中心点y坐标 归一化后框的宽度 归一化后框的高度
  1. 训练YOLOv8时,需要存放数据集的目录结构如下(图像与标签路径必须对应):
├─datasets
│  ├─images
│  │  ├─train2024   # jpg/png 训练集图片
│  │  └─val2024     # jpg/png 验证集图片
│  ├─labels
│  │  ├─train2024   # txt 训练集标签
│  │  └─val2024     # txt 验证集标签

3.2.3 创建训练配置文件

content = """path: ./PCB_DATASET # 数据集的根目录
train: images/train2024 # train images
val: images/val2024 # val images

# 分类类别
names:
  0: missing_hole
  1: mouse_bite
  2: open_circuit
  3: short
  4: spur
  5: spurious_copper
"""

with open(r"dataset.yaml", mode='w', encoding='UTF-8') as f:
    f.write(content)

3.2.4 下载预训练模型

# 下载预训练的yolo8模型
import os
from modelscope.hub.api import HubApi
api = HubApi()
api.login('Your Modelscope SDK 令牌') # 通过访问:https://www.modelscope.cn/my/myaccesstoken 进行获取,需要提交下载申请

# 不同大小YOLO8模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('ModelBulider/yolo8', local_dir="./modelscope_downloads")


yolo_version = 'yolov8l' # 选择训练使用yolo8的版本,可以在modelscope_downloads中查看所有的YOLO8版本
yolov8_model_path = os.path.abspath(os.path.join(model_dir, f'{yolo_version}.pt'))
print(yolov8_model_path)
  • YOLO8包含了各种大小版本的模型,各模型大小、性能等参数比较如下:
    在这里插入图片描述
  • 如需要下载,可CSDN私信联系博主,佛系回复敬请谅解~
  • 可在yolo_version 处选择特定版本的YOLOv8预训练模型进行加载

3.2.5 训练模型

import os
from ultralytics import YOLO

def download_train_file():
    """
    下载训练所需的文件
    """
    os.system("cp ./modelscope_downloads/Arial.ttf /root/.config/Ultralytics/")

if __name__ == '__main__':
    download_train_file()
    # Load a model
    # model = YOLO("yolov8n.yaml")  # build a new model from scratch
    model = YOLO(f'{yolo_version}.yaml').load(yolov8_model_path)  # load a pretrained model (recommended for training)

    # Use the model
    model.train(data="dataset.yaml", imgsz=640, batch=16, workers=8, cache=True, epochs=100)  # train the model
    metrics = model.val()  # evaluate model performance on the validation set
    # results = model("ultralytics\\assets\\bus.jpg")  # predict on an image
    path = model.export(format="onnx", opset=13)  # export the model to ONNX format
  • 训练日志:

在这里插入图片描述

  • 更多训练参数配置,可参考:https://docs.ultralytics.com/modes/train/

3.2.6 训练结果

  • 训练产生的数据会生成在runs/detect/train路径下。其中,weight种存储了,训练过程中表现最好的模型参数(best.pt)以及最后一次训练得到的模型参数(last.pt)
    在这里插入图片描述
  • 训练结果验证
from ultralytics import YOLO

# Load a model
model = YOLO(r'runs/detect/train/weights/best.pt')  # pretrained YOLOv8n model

# Run batched inference on a list of images
results = model([r"datasets/PCB_DATASET/images/train2024/01_missing_hole_01.jpg", 
                 r"datasets/PCB_DATASET/images/train2024/01_missing_hole_17.jpg"])  # return a list of Results objects

# Process results list
for idex, result in enumerate(results):
    boxes = result.boxes  # Boxes object for bounding box outputs
    masks = result.masks  # Masks object for segmentation masks outputs
    keypoints = result.keypoints  # Keypoints object for pose outputs
    probs = result.probs  # Probs object for classification outputs
    obb = result.obb  # Oriented boxes object for OBB outputs
    result.show()  # display to screen
    result.save(filename=f"result_{idex}.jpg")  # save to disk

在这里插入图片描述
在这里插入图片描述

四、基于YOLO8的PCB缺陷检测系统

  • 使用训练得到模型,开发缺陷检测系统

在线体验:https://www.modelscope.cn/studios/ModelBulider/yolo_pcb_dec

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android逆向题解攻防世界-easy-apk

Jeb反编译apk 题目比较简单,就是一个改了码表的base64编码。 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(0x7F04001B); // layout:activity_main((Button)this.findViewById(0x7F0B0076)).set…

在已经装过Tomcat机子运行war包

1 检查防火墙,验证是否装有jdk,是否配置有JAVA_HOME: ls /usr/apache-tomcat-9.0.52/webapps/ROOT rm -rf /usr/apache-tomcat-9.0.52/webapps/ROOT* ls /usr/apache-tomcat-9.0.52/webapps/ROOT cd /usr/apache-tomcat-9.0.52/webapps/ROOT ls 把war包拉到ROOT…

Python | Leetcode Python题解之第342题整数拆分

题目&#xff1a; 题解&#xff1a; class Solution:def integerBreak(self, n: int) -> int:if n < 3:return n - 1quotient, remainder n // 3, n % 3if remainder 0:return 3 ** quotientelif remainder 1:return 3 ** (quotient - 1) * 4else:return 3 ** quotie…

革新测试管理:集远程、协同、自动化于一身的统一测试管理平台

一、研发背景 当下汽车电子测试领域随着不断发展&#xff0c;自动化、智能化的软硬件一体测试解决方案已经成为趋势。能够整合各种测试资源、自动化测试流程&#xff0c;并提供数据分析和可视化报告&#xff0c;从而提高测试效率、降低成本&#xff0c;并确保汽车电子系统的可…

金价多次尝试刷新最高纪录,美国零售销售数据是绊马索

金价一直在试探新高&#xff0c;该纪录为每盎司2,485美元。而且&#xff0c;强劲的美国零售销售报告正在阻止金价的上涨。 由于强大的阻力&#xff0c;金价无法继续上涨。一周的净空头头寸大增。 发布了强于预期的美国零售销售报告后&#xff0c;金价承受了压力。期望的50个基…

springboot schedule配置多任务并行,任务本身串行

场景&#xff1a; 每日凌晨要执行两个定时任务&#xff0c;分别属于两个业务。有一个业务的定时任务执行时间较长&#xff0c;该任务没执行完之前不能重复执行&#xff08;事务&#xff09;。即业务与业务之间并行&#xff0c;任务本身串行。 技术栈&#xff1a; 采用spring…

机器学习 第11章-特征选择与稀疏学习

机器学习 第11章-特征选择与稀疏学习 11.1 子集搜索与评价 我们将属性称为“特征”(feature)&#xff0c;对当前学习任务有用的属性称为“相关特征”(relevant feature)、没什么用的属性称为“无关特征”(irrelevant feature)。从给定的特征集合中选择出相关特征子集的过程&a…

STL—list—模拟实现【迭代器的实现(重要)】【基本接口的实现】

STL—list—模拟实现 1.list源代码 要想模拟实现list&#xff0c;还是要看一下STL库中的源代码。 _list_node里面装着指向上一个节点的指针prev&#xff0c;和指向下一个节点的指针next&#xff0c;还有数据data 并且它给的是void*&#xff0c;导致后面进行节点指针的返回时…

【大模型部署及其应用 】使用 Llama 3 开源和 Elastic 构建 RAG

使用 Llama 3 开源和 Elastic 构建 RAG 本博客将介绍使用两种方法实现 RAG。 Elastic、Llamaindex、Llama 3(8B)版本使用 Ollama 在本地运行。 Elastic、Langchain、ELSER v2、Llama 3(8B)版本使用 Ollama 在本地运行。 笔记本可从此GitHub位置获取。 在开始之前,让我…

objdump常用命令

语法: objdump <option(s)> <file(s)>用法: 1.打印出与文件头相关的所有信息: 2.打印二进制文件 khushi 中可执行部分的汇编代码内容: objdump -d bomb 3.打印文件的符号表: objdump -t bomb 4.打印文件的动态符号表: objdump -T bomb 5.显示…

watch 和 watchEffect 的隐藏点 --- 非常细致

之前有一篇文章讲述了 watch 和 watchEffect 的使用&#xff0c;但在实际使用中&#xff0c;仍然存在一些“隐藏点”&#xff0c;可能会影响开发&#xff0c;在这补充一下。 1. watch 的隐藏点 1.1 性能陷阱&#xff1a;深度监听的影响 当在 watch 中使用 deep: true 来监听…

多模态大模型中的幻觉问题及其解决方案

人工智能咨询培训老师叶梓 转载标明出处 多模态大模型在实际应用中面临着一个普遍的挑战——幻觉问题&#xff08;hallucination&#xff09;&#xff0c;主要表现为模型在接收到用户提供的图像和提示时&#xff0c;可能会产生与图像内容不符的描述&#xff0c;例如错误地识别颜…

Windows下pip install mysqlclient安装失败

有时候安装mysqlclient插件报如下错误 提示先安装mysqlclient的依赖wheel文件 下载链接(必须对应版本&#xff0c;python3.6版本对1.4.4版本) 如下选择历史版本 mysqlclient官网 https://pypi.org/project/mysqlclient/python3.6对应版本 https://pypi.org/project/mysqlcl…

网络安全实训第一天(dami靶场搭建,XSS、CSRF、模板、任意文件删除添加、框架、密码爆破漏洞)

1.环境准备&#xff1a;搭建漏洞测试的基础环境 安装完phpstudy之后&#xff0c;开启MySQL和Nginx&#xff0c;将dami文件夹复制到网站的根目录下&#xff0c;最后访问安装phptudy机器的IP地址 第一次登录删除dami根目录下install.lck文件 如果检测环境不正确可以下载php5.3.2…

ubuntu20 lightdm无法自动登录进入桌面

现象&#xff1a;在rk3568的板子上自己做了一个Ubuntu 20.04的桌面系统。配置lightdm自动登录桌面&#xff0c;配置方法如下&#xff1a; $ vim /etc/lightdm/lightdm.conf [Seat:*] user-sessionxubuntu autologin-userusername #修改成自动登录的用户名 greeter-show-m…

如何做萤石开放平台的物联网卡定向?

除了用萤石自带的4G卡外&#xff0c;我们也可以自己去电信、移动和联通办物联网卡连接萤石云平台。 1、说在前面 注意&#xff1a;以下流程必须全部走完&#xff0c;卡放在设备上才能连接到萤石云平台。 2、大致流程 登录官网→下载协议→盖章&#xff08;包括骑缝章&#…

Hyperf 安装,使用,

安装&#xff0c; 一般开发都是windows,所以用虚拟机或docker 使用 启动 php bin/hyperf.php start如果出现端口被占用&#xff0c;下面的处理方法 查看9501端口那个进程在占用 netstat -anp|grep 95012. kill掉 kill 18然后再启动即可 热更新 Watcher 组件除了解决上述…

【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发

使用要求 1、用的是google里面的扩展打包成crx文件&#xff0c;所以在使用之前你需要确保自己电脑上有google浏览器&#xff0c;而且google浏览器版本需要在124之上。&#xff08;要注意一下&#xff0c;就是电脑只能有一个Chrome浏览器&#xff09; 2、在win10上用vscode开发…

网络编程:OSI协议,TCP/IP协议,IP地址,UDP编程

目录 国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 2.TCP/IP协议模型&#xff1a; 应用层 &#xff1a; 传输层&#xff1a; 网络层&#xff1a; IPV4协议 IP地址 IP地址的划分&#xff1a; 公有地址 私有地址 MA…

jmeter引入jar包的三种方式

示例 实现对登录密码进行MD5加密 pom文件依赖 <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.12&l…