復現YOLOV5+訓練指定數據集

一、復現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:日期字段&…