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

文章目录
- 一、引言
- 二、环境说明
- 三、缺陷检测任务模型训练详解
- 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、PyTorch
二、环境说明
- 本文介绍的训练过程,使用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格式的数据集
- 创建训练集与测试集的标签文件
import json
import osdef 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,htmp = 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)
- 创建训练集与测试集的数据集
import os
import shutilImages_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的训练规范说明
- YOLO训练标签示例如下(转换目标):
类别id 归一化后框中心点x坐标 归一化后框中心点y坐标 归一化后框的宽度 归一化后框的高度
- 训练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_hole1: mouse_bite2: open_circuit3: short4: spur5: 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 YOLOdef 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 scratchmodel = YOLO(f'{yolo_version}.yaml').load(yolov8_model_path) # load a pretrained model (recommended for training)# Use the modelmodel.train(data="dataset.yaml", imgsz=640, batch=16, workers=8, cache=True, epochs=100) # train the modelmetrics = model.val() # evaluate model performance on the validation set# results = model("ultralytics\\assets\\bus.jpg") # predict on an imagepath = 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 outputsmasks = result.masks # Masks object for segmentation masks outputskeypoints = result.keypoints # Keypoints object for pose outputsprobs = result.probs # Probs object for classification outputsobb = result.obb # Oriented boxes object for OBB outputsresult.show() # display to screenresult.save(filename=f"result_{idex}.jpg") # save to disk


四、基于YOLO8的PCB缺陷检测系统
- 使用训练得到模型,开发缺陷检测系统
在线体验:https://www.modelscope.cn/studios/ModelBulider/yolo_pcb_dec

相关文章:
基于YOLOv8的缺陷检测任务模型训练
文章目录 一、引言二、环境说明三、缺陷检测任务模型训练详解3.1 PCB数据集3.1.1 数据集简介3.1.2 数据集下载3.1.3 构建yolo格式的数据集 3.2 基于ultralytics训练YOLOv83.2.1 安装依赖包3.2.2 ultralytics的训练规范说明3.2.3 创建训练配置文件3.2.4 下载预训练模型3.2.5 训练…...
【upload]-ini-[SUCTF 2019]CheckIn-笔记
上传图片木马文件后看到,检查的文件内容,包含<? 一句话木马提示 检查的文件格式 用如下图片木马,加上GIF89a绕过图片和<?检查 GIF89a <script languagephp>eval($_POST[cmd])</script> .user.ini实际上就是一个可以由用…...
uniapp条件编译使用教学(#ifdef、#ifndef)
#ifdef //仅在xxx平台使用#ifndef //除了在xxx平台使用#endif // 结束 标识平台APP-PLUSAPPMP微信小程序/支付宝小程序/百度小程序/头条小程序/QQ小程序MP-WEIXIN微信小程序MP-ALIPAY支付宝小程序MP-BAIDU百度小程序MP-TOUTIAO头条小程序MP-QQQQ小程序H5H5APP-PLUS-NVUEApp nv…...
NXP i.MX8系列平台开发讲解 - 4.1.2 GNSS 篇(二) - 卫星导航定位原理
专栏文章目录传送门:返回专栏目录 Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】 文章目录 关注星号公众号,不容错过精彩 作者:HywelStar Hi, 我是你们的老朋友HywelStar, 根…...
怎样在 SQL 中对一个包含销售数据的表按照销售额进行降序排序?
在当今数字化商业的浪潮中,数据就是企业的宝贵资产。对于销售数据的有效管理和分析,能够为企业的决策提供关键的支持。而在 SQL 中,对销售数据按照销售额进行降序排序,是一项基础但极其重要的操作。 想象一下,您面前有…...
DIAdem 与 LabVIEW
DIAdem 和 LabVIEW 都是 NI (National Instruments) 公司开发的产品,尽管它们有不同的核心功能和用途,但它们在工程、测试和测量领域中常常一起使用,以形成一个完整的数据采集、分析、处理和报告生成的解决方案。 1. 功能和用途 LabVIEW (Lab…...
UE虚幻引擎可以云渲染吗?应用趋势与挑战了解
虚幻云渲染技术是基于虚幻引擎的云端渲染技术,将虚幻引擎的渲染计算任务通过云计算的方式进行处理和渲染、并将渲染结果传输到终端设备上进行展示。虚幻引擎云渲染技术在近年来得到了迅猛的发展,并在各个领域得到了广泛的应用,包括游戏、电影…...
实战分享:DefenderUI在企业环境中的部署与应用
前言 想象一下,你的电脑就像一座坚固的城堡,但城门却时常被一些不速之客窥探甚至企图入侵;Defender,作为城堡自带的守护者,实力自然不容小觑;但你是否觉得它有时候太过低调,有些隐藏技能还没完…...
中英双语介绍金融经济中的鹰派 (Hawkish)和鸽派 (Dovish)
中文版 在金融和经济政策中,“鹰派”和“鸽派”是两种对货币政策和经济管理有不同立场的群体。 鹰派 (Hawkish) 鹰派倾向于担心通货膨胀的风险,通常支持较高的利率和更紧的货币政策,以防止经济过热和控制物价上涨。具体特征包括࿱…...
Android 开发中常用的布局类型及其选择指南
在 Android 开发过程中,选择正确的布局类型对于构建高效、美观且响应式的用户界面至关重要。本文将介绍 Android 中几种最常用的布局类型,并对比它们的特点和适用场景,帮助开发者们做出明智的选择。 1. LinearLayout - 线性布局 特点: LinearLayout 是最基本的布局类型之一…...
短视频SDK解决方案,降低行业开发门槛
美摄科技匠心打造了一款集前沿技术与极致体验于一体的短视频SDK解决方案,它不仅重新定义了短视频创作的边界,更以行业标杆级的短视频特效,让每一帧画面都闪耀不凡光芒。 【技术赋能,创意无限】 美摄科技的短视频SDK,…...
【C++】String常见函数用法
一、string类对象的常见构造 我们可采取以下的方式进行构造,以下是常用的接口: //生成空字符串 string; //拷贝构造函数 string(const string& str); //用C-string来构造string类对象 string(const char* s); //string类对象中包含n个字符c strin…...
LeetCode49.字母异位词分组
题目大意 给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。 字母异位词是由重新排列源单词的所有字母得到的一个新单词。 思路分析 示例 1: 输入: strs ["eat", "tea", "tan", "ate", &…...
Nginx日志按天分割
需求、日志按照天的单位进行分割存储。 如果你直接百度,可能会搜到很多教你用各种脚本或是三方插件来按天分割的,这边我用nginx服务本身来分割日志。 方法一 通过使用 $time_iso8601 变量和 map 指令,实现了日志文件按天分割的功能。以下是…...
文本摘要简介
文本摘要是从一段长文本中提取出最重要的信息,并生成一个简短而有意义的摘要。这个过程可以分为两种主要方法: 抽取式摘要(Extractive Summarization):从原文中直接提取出关键句子或段落,组成摘要…...
3.MySQL面试题之Redis 和 Mysql 如何保证数据一致性?
Redis 和 MySQL 数据一致性是分布式系统中的一个常见挑战。保证数据一致性通常涉及几种策略,我会详细解释这些策略并提供相应的代码示例。 先更新数据库,再更新缓存 这种方法先更新 MySQL,然后更新或删除 Redis 缓存。 Transactional publ…...
浅谈TCP协议、UDP协议
一、介绍说明 TCP(传输控制协议) 面向连接:TCP在数据传输之前必须建立连接。这通过一个称为三次握手的过程来完成,确保连接的两端都准备好进行数据传输。 可靠性:TCP提供可靠的数据传输,确保数据包正确无…...
SQL业务题: 从不订购的客户
1️⃣题目 Customers 表: ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- 在 SQL 中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名…...
怎么直接在PDF上修改内容?随心编辑PDF内容
PDF(Portable Document Format)作为一种专用于阅读而非编辑的文档格式,其设计的核心目的是保持文档格式的一致性,确保文档在不同平台和设备上都能以相同的布局和格式呈现。然而,在实际工作和生活中,我们经常需要对PDF文档进行编辑…...
聊天室项目测试报告
项目介绍 本项目是一个基于Spring Boot框架开发的聊天室应用。一个实时的文本消息交流平台,允许多个用户同时在线聊天。系统采用了Spring Boot作为后端框架,集成了WebSocket技术以实现消息的实时推送与接收提供一个简单、易用且功能完备的在线聊天环境。…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
