一、复现YOLOV5代码

1.github下载:https://github.com/MIPIT-Team/SSA-YOLO

2.配置环境:创建虚拟环境yolo5

conda create -n yolo5 python=3.9
#对应文件夹下pip install -r requirements.txt

报错:ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
imbalanced-learn 0.12.0 requires scikit-learn>=1.0.2, which is not installed.
imbalanced-learn 0.12.0 requires threadpoolctl>=2.0.0, which is not installed.
moviepy 1.0.3 requires imageio<3.0,>=2.5; python_version >= "3.4", which is not installed. 

解决方案:按照要求下载对应库文件。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  " scikit-learn>=1.0.2"
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  " threadpoolctl>=2.0.0"
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  " imageio<3.0"&&">=2.5"

3.运行train.py,增加代码:

os.environ["GIT_PYTHON_REFRESH"] = "quiet"

4.成功运行coco128数据集

二、训练指定数据集--DeepPCB

1.数据集归一化

a)明确数据集尺寸、标签信息。本文使用DeepPCB数据集,该数据集图片尺寸为640*640,标签信息为左上右下两个坐标点(绝对位置)及缺陷类型。需要将标签信息修改为YOLOV5代码格式(坐标点位置为相对位置):缺陷类型、中心点坐标、宽、高。--缺陷类型:1-open, 2-short, 3-mousebite, 4-spur, 5-copper, 6-pin-hole。

DeepPCB数据集:tangsanli5201/DeepPCB:一个PCB缺陷数据集。(具体阅读对应的readme.txt)

  • 根据自建数据集要求,利用trainval.txt文件生成图片images和标签labels文件夹。--配置1000张训练图。
import os
import shutildef move_files_from_txt(txt_path, img_target="./images", label_target="./labels"):"""从指定txt文件读取路径,移动对应图片和标签文件到目标文件夹参数:txt_path: 包含文件路径的txt文件img_target: 图片目标文件夹label_target: 标签目标文件夹"""# 初始化统计变量success_count = 0fail_records = []# 创建目标文件夹(不存在则创建)os.makedirs(img_target, exist_ok=True)os.makedirs(label_target, exist_ok=True)print(f"图片目标路径: {os.path.abspath(img_target)}")print(f"标签目标路径: {os.path.abspath(label_target)}")try:# 读取文件内容并处理每一行with open(txt_path, 'r', encoding='utf-8') as file:for line_num, line in enumerate(file, 1):  # 记录行号,方便定位错误line = line.strip()  # 去除首尾空白和换行符if not line:  # 跳过空行continuetry:# 分割行内容(处理可能的多空格情况)parts = line.split()if len(parts) < 2:raise ValueError("行格式不正确,至少需要两个部分")# 构建图片和标签路径img_name = f"{parts[0].split('.')[0]}_test.jpg"img_path = os.path.abspath(img_name)  # 转为绝对路径,避免相对路径问题label_path = os.path.abspath(parts[-1])# 检查文件是否存在if not os.path.exists(img_path):raise FileNotFoundError(f"图片文件不存在: {img_path}")if not os.path.exists(label_path):raise FileNotFoundError(f"标签文件不存在: {label_path}")# 复制文件shutil.copy2(img_path, os.path.join(img_target, os.path.basename(img_path).split("_")[0]+".jpg"))shutil.copy2(label_path, os.path.join(label_target, os.path.basename(label_path)))success_count += 1print(f"已移动 [{line_num}行]: {os.path.basename(img_path)} 和 {os.path.basename(label_path)}")except Exception as e:# 记录单行处理错误fail_info = f"第{line_num}行处理失败: {str(e)}"fail_records.append(fail_info)print(fail_info)except FileNotFoundError:print(f"错误: 找不到txt文件 {txt_path}")returnexcept Exception as e:print(f"读取txt文件时发生错误: {str(e)}")return# 输出最终统计print("\n" + "=" * 60)print(f"处理完成: 成功移动 {success_count} 组文件")if fail_records:print(f"处理失败 {len(fail_records)} 组文件,详情如下:")for info in fail_records:print(f"- {info}")if __name__ == "__main__":# 配置路径txt_file_path = "./trainval.txt"  # 源txt文件路径images_folder = "./images"  # 图片目标文件夹labels_folder = "./labels"  # 标签目标文件夹# 执行移动操作move_files_from_txt(txt_file_path, images_folder, labels_folder)
  • 将标签信息更改为标准形式:类别、中心点坐标、宽、高。--相对位置
import osdef convert_to_yolo_format(input_dir, output_dir=None, image_width=640, image_height=640):"""批量转换标注文件格式为YOLO格式参数:input_dir: 包含原始txt标注文件的目录output_dir: 转换后文件的保存目录,默认与输入目录相同image_width: 图像宽度,默认640image_height: 图像高度,默认640"""# 如果未指定输出目录,则使用输入目录if output_dir is None:output_dir = input_direlse:# 创建输出目录(如果不存在)os.makedirs(output_dir, exist_ok=True)# 统计变量total_files = 0total_lines = 0error_files = []# 遍历输入目录中的所有txt文件for filename in os.listdir(input_dir):if filename.endswith('.txt'):total_files += 1input_path = os.path.join(input_dir, filename)output_path = os.path.join(output_dir, filename)try:with open(input_path, 'r', encoding='utf-8') as infile, \open(output_path, 'w', encoding='utf-8') as outfile:for line_num, line in enumerate(infile, 1):line = line.strip()if not line:  # 跳过空行continuetotal_lines += 1# 分割行内容(格式为:x1 y1 x2 y2 class)parts = line.split()if len(parts) != 5:raise ValueError(f"格式错误,预期5个值,实际{len(parts)}个值")# 解析坐标和类别x1, y1, x2, y2, cls = parts# 转换为浮点数try:x1 = float(x1)y1 = float(y1)x2 = float(x2)y2 = float(y2)except ValueError:raise ValueError("坐标值必须为数字")# 计算YOLO格式所需的参数center_x = (x1 + x2) / 2.0 / image_width  # 中心点x坐标(归一化)center_y = (y1 + y2) / 2.0 / image_height  # 中心点y坐标(归一化)width = (x2 - x1) / image_width  # 宽度(归一化)height = (y2 - y1) / image_height  # 高度(归一化)# 确保值在[0, 1]范围内center_x = max(0.0, min(1.0, center_x))center_y = max(0.0, min(1.0, center_y))width = max(0.0, min(1.0, width))height = max(0.0, min(1.0, height))# 写入转换后的数据(保留6位小数)outfile.write(f"{cls} {center_x:.6f} {center_y:.6f} {width:.6f} {height:.6f}\n")print(f"已转换: {filename}")except Exception as e:error_msg = f"处理文件 {filename} 时出错: {str(e)}"print(error_msg)error_files.append(error_msg)# 输出统计信息print("\n" + "=" * 60)print(f"转换完成: 共处理 {total_files} 个文件,{total_lines} 行标注")if error_files:print(f"处理失败 {len(error_files)} 个文件:")for err in error_files:print(f"- {err}")if __name__ == "__main__":# 配置输入输出目录input_directory = "./labels"  # 包含原始标注文件的目录output_directory = "./labels-c"  # 转换后文件的保存目录# 执行转换convert_to_yolo_format(input_dir=input_directory,output_dir=output_directory,image_width=640,image_height=640)

b)将数据集文件放在与YOLOV5文件同一级的datasets中(./datasets/DeepPCB),生成PCBData.yaml(./data)文件。

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/DeepPCB # dataset root dir
train: images/train2025 # train images (relative to 'path') 128 images
val: images/train2025 # val images (relative to 'path') 128 images
test: # test images (optional)# Classes
names:0: background1: open2: short3: mousebite4: spur5: copper6: pin-hole

2.运行train.py

建议:worker默认值修改为0。

利用Pycharm运行时出现闪退情况:IDE error occured。

解决方案:IDEA 性能优化设置。

打开vmoptions,做出如下修改。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Agents-SDK智能体开发[4]之集成MCP入门

文章目录说明一 Agents SDK接入MCP1.1 MCP技术回顾1.2 MCP基础实践流程1.2.1 天气查询服务器Server创建流程1.2.2 服务器依赖安装和代码编写1.2.3 环境配置文件1.2.4 客户端代码编写1.3 测试运行二 MCPAgents SDK基础调用2.1 weather_server.py2.2 client_agent.py2.3 运行测试…

Camera相机人脸识别系列专题分析之十九:MTK ISP6S平台FDNode传递三方FFD到APP流程解析

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: Camera相机人脸识别系列专题分析之十九:MTK平台FDNode传递三方FFD到APP流程解析 目录 一、背景 二、:OcamMeta传递FFD到APP 2.1:OcamMeta 2.2 :OcamMeta::process更新FFD 2.…

【实时Linux实战系列】构建实时监测与报警系统

在实时系统中&#xff0c;监测与报警系统是确保系统正常运行和及时响应异常情况的关键组件。实时监测与报警系统能够实时收集系统数据&#xff0c;分析关键事件&#xff0c;并在检测到异常时发出警报。这种系统广泛应用于工业自动化、医疗设备监控、网络安全等领域。掌握实时监…

PHP入门及数据类型

PHP数据类型 PHP标记 //HTML风格 <?phpecho "hello world"; ?> //简短风格 <?echo "hello world"; ?>数据类型 PHP 最初源于 Perl 语言&#xff0c;与 Perl 类似&#xff0c;PHP 对数据类型采取较为宽松的态度。PHP 规定&#xff0c;变量数…

沸点 | 嬴图参加世界人工智能大会

2025 WAIC于 7 月 26 日至 28 日在上海举行。大会展览面积突破 7 万平方米&#xff0c;800 余家企业参展。嬴图作为图数据库领域的领先企业&#xff0c;携前沿技术与创新应用精彩亮相。​大会期间&#xff0c;嬴图创始人兼CEO孙宇熙与来自全球的顶尖学者、企业代表共同探讨人工…

2. 字符设备驱动

一、设备号 1.1. 什么是设备号 设备号是用来标记一类设备以及区分这类设备中具体个体的一组号码。 设备号由主设备号和次设备号组成。主设备号的作用为标记一类设备、用于标识设备驱动程序,而次设备号的作用是为了区分这类设备中的具体个体设备及用于标识同一驱动程序下的具…

uboot armv8 启动流程之 linker script

section 详细说明.text按如下顺序&#xff0c;中断向量表vectors, 启动入口代码start.o,普通text, glue &#xff08;arm thumb2 相互调用时自动生成的代码&#xff09;*(.vectors)CPUDIR/start.o (.text*)*(.text*)*(.glue*)__image_copy_start 标记为text 段入口&#xff0c;…

xxljob总结

XXL-Job 支持多种任务类型&#xff0c;以下是常见任务类型的示例 Demo&#xff0c;包含核心配置和代码片段&#xff0c;帮助快速理解用法&#xff1a;一、Bean模式任务&#xff08;最常用&#xff09;通过注解 XxlJob 定义任务方法&#xff0c;直接在 Spring 容器中管理&…

Python包安全工程实践:构建安全可靠的Python生态系统

在现代计算环境中&#xff0c;性能往往是Python包成功的关键因素。本文将深入探讨Python包的性能优化技术&#xff0c;包括并发编程模型、性能分析工具、内存优化策略以及原生代码集成等高级主题&#xff0c;帮助你构建高性能的Python组件。1. 性能分析基础1.1 性能分析工具矩阵…

kubernetes基础知识

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; https://blog.csdn.net/qq_52914969?typeblog一、kubernetes介绍Kubernetes本质是一组服务器集群&#xff0c;它可以在集群的每个节点上运行特定的程序&#xff0c;来对节点中的容器进行…

winntsetup安装驱动和光驱安装F6功能一样----NT5.2.3790源代码分析

D:\drv>dir驱动器 D 中的卷是 新加卷卷的序列号是 443D-D64BD:\drv 的目录2025-08-03 23:57 <DIR> . 2025-08-03 23:57 <DIR> .. 2008-05-27 10:01 119,068 yk51x86.cat 2008-05-20 10:01 969,380 yk51x86.inf…

Web 开发 11

今天完成了workshop2&#xff0c;进度有点慢&#xff0c;但是记录一下极为愚蠢的一轮轮问答和思考~&#xff01;&#xff08;还是有点成就感的&#xff09;ps&#xff1a;【】内为我的提问1 导入语句&#xff08;ES6 模块导入语法&#xff09;【import CatHappiness from "…

写作路上的迷茫与突破

曾经&#xff0c;我也是那个在写作面前踌躇不前的人。每次提笔&#xff0c;满心都是“我写不好”“我没什么可写的”“我达不到别人的高度”……这些念头像藤蔓一样&#xff0c;紧紧缠绕着我&#xff0c;让我寸步难行。我看着群里的小伙伴们一个个妙笔生花&#xff0c;自己却只…

23 Active Directory攻击与防护策略解析

引言 Active Directory&#xff08;AD&#xff09;是企业IT环境中用户认证、访问控制和身份管理的核心。因其掌握整个网络的"钥匙"&#xff0c;AD常成为攻击者的首要目标。 从凭证转储到隐蔽侦察&#xff0c;攻击者通过多种手段控制AD。无论您是网络安全分析师、红…

【内容规范】关于标题中【】标记的使用说明

【内容规范】关于标题中【】标记的使用说明 在信息爆炸的时代&#xff0c;如何让内容更易识别、更具条理性&#xff0c;成为内容创作者和平台运营者共同关注的问题。标题中【】标记的使用&#xff0c;正是在这种需求下形成的一种实用规范。 这种规范的核心作用在于建立统一的内…

centos 9 安装docker教程

拉取相关依赖 dnf -y install dnf-plugins-core设置阿里云镜像库 dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装docker dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plu…

关闭Jetbrains Mono字体连写、连字功能

所谓的关闭Jetbrains Mono字体连写&#xff0c;其实就是更换为Jetbrains Mono NL字体二者的区别就是符号间距的大小不同&#xff0c;也就是有无连字功能。 下图以Visutal Studio为例&#xff1a;

漫花软件集合分享

漫花软件集合分享的各种apk 1、磁盘漫画【推荐】 2、你搜 3、皮皮喵 4、泼辣漫画 5、趣漫画 6、异次元&图源 7、漫 8、再漫画X 9、章鱼漫画 10、芝士漫画&图源 通过网盘分享的文件&#xff1a;漫画软件 链接: https://pan.baidu.com/s/1dlGl50MNzzVOdTP38_…

DB-GPT 0.7.3 版本更新:支持Qwen3 Embedding和Reranker模型、支持知识库自定义检索策略等

V0.7.3版本主要新增、增强了以下核心特性 &#x1f340; 支持Qwen3 Embedding和Reranker模型 &#x1f340; 支持知识库自定义检索策略&#xff1a;语义检索、全文检索、树形检索、混合检索等 &#x1f340; 新增GaussDB数据源支持 &#x1f340; 支持GLM-4.1V多模态模型 …

Django常见模型字段

AutoField:数据库中的自动增长类型&#xff0c;相当于ID自动增长的IntegerField类型字段&#xff0c;对应mysql的Int类型 BooleanField:真/假的布尔类型字段&#xff0c;对应mysql的Tinyint类型 CharField:字符类型字段&#xff0c;对应mysql的varChar类型 DateField:日期字段&…