Yolo遷移訓練-帶訓練源碼

目錄

下載Git

拉下yolo模型

下載labelimg

準備訓練集

遷移訓練

繼續訓練


下載Git

Git - Downloading Package

拉下yolo模型

然后用克隆腳本拉下yolo模型

python clone_yolo.py
import os
import subprocess
import sys
import shutildef check_git_installed():"""檢查Git是否已安裝"""try:result = subprocess.run(['git', '--version'], capture_output=True, text=True)if result.returncode == 0:print(f"Git已安裝: {result.stdout.strip()}")return Truereturn Falseexcept:return Falsedef clone_yolo():"""克隆YOLOv5倉庫"""# 獲取當前工作目錄work_dir = os.path.dirname(os.path.abspath(__file__))# 檢查是否已存在yolov5目錄yolo_dir = os.path.join(work_dir, 'yolov5')if (os.path.exists(yolo_dir)):print(f"YOLO目錄已存在({yolo_dir})。自動刪除并重新克隆...")shutil.rmtree(yolo_dir, ignore_errors=True)# 克隆YOLOv5倉庫 - 使用實時輸出而不是捕獲輸出print("正在克隆YOLOv5倉庫,這可能需要幾分鐘時間...")print("(下載進度將實時顯示,請耐心等待)")try:# 使用實時輸出方式運行git cloneresult = subprocess.run(['git', 'clone', 'https://github.com/ultralytics/yolov5.git'],cwd=work_dir,capture_output=False,  # 不捕獲輸出,讓它直接顯示在控制臺text=True)if result.returncode == 0:print("YOLOv5倉庫克隆成功!")# 安裝依賴print("\n正在安裝YOLOv5依賴...")requirements_file = os.path.join(yolo_dir, 'requirements.txt')if os.path.exists(requirements_file):try:subprocess.run([sys.executable, '-m', 'pip', 'install', '-r', requirements_file],check=True,capture_output=False  # 實時顯示安裝進度)print("YOLOv5依賴安裝完成!")except subprocess.CalledProcessError as e:print(f"警告: 安裝依賴時出錯: {str(e)}")print("您可能需要手動安裝依賴。")else:print(f"警告: 找不到requirements.txt文件({requirements_file})。")return Trueelse:print(f"克隆YOLOv5倉庫失敗,返回代碼: {result.returncode}")return Falseexcept Exception as e:print(f"執行Git命令時出錯: {e}")return Falseif __name__ == "__main__":if not check_git_installed():print("Git尚未安裝或無法在PATH中找到。")print("請先運行 install_git.py 腳本安裝Git,然后重新運行此腳本。")sys.exit(1)print("開始克隆YOLOv5倉庫,請確保網絡連接正常...")if clone_yolo():print("\nYOLOv5克隆和設置完成!")print("您現在可以使用 train_fruits.py 腳本進行水果識別的遷移學習。")else:print("\n克隆YOLO倉庫失敗,請檢查錯誤信息并重試。")

下載labelimg

在下載yolo的過程中可以先去https://github.com/tzutalin/labelImg/releases下載給圖像打標簽的工具 labelimg

準備訓練集

在 label 完后會生成 txt 文件(注意同一個水果圖片的?.jpg和 .txt前面的名稱要一樣,比如apple_01.jpg 和 apple_01.txt )

建立一個 dataset?文件夾,并在該目錄下建立 images 和 labels 文件夾,并在這兩個文件夾下面創建兩個子文件夾,一個叫 train 用于存儲訓練集,一個叫 val 用于存儲驗證集

比如標簽的訓練集.txt文件就放在 label\val

接著我們就用labelimg框選訓練集

🧭 一、啟動軟件

  1. 如果你是通過命令行運行的,輸入:

    python labelImg.py
  2. 或者直接運行 labelImg.exe(Windows 下)。

🖼 二、打開圖片文件夾

點擊左上角的按鈕:

  • Open Dir:選擇你存放圖像的文件夾(比如 images/)

  • 如果 Open Dir 找不到的話,也可以直接 Open 打開圖片

🧩 三、選擇保存標注的格式

點擊:

  • ?YOLO(保存為 .txt 格式,適用于 YOLO 模型)

?? 四、開始標注步驟

  1. 點擊工具欄上的 Create RectBox 按鈕(或快捷鍵 w)

  2. 用鼠標在圖片上 點擊并拖動,畫出一個框框(比如把貓框住)

  3. 系統會彈出一個窗口,輸入標簽名(如:cat) → 回車

  4. 你可以繼續框其他對象,每個對象一個框

💾 五、保存標注

點擊左上角的:

  • Save 按鈕(或快捷鍵 Ctrl+S),系統會把標注保存為 .xml 或 .txt 文件,放在和圖像同目錄下。

? 六、切換到下一張圖像

  • 點箭頭按鈕 ? 或按 d 切換到下一張圖像繼續標注

  • 按 a 切換上一張圖像

  • 按 Ctrl + S 隨時保存標注結果

?? 常用快捷鍵:

w? ? ? ? ????????框選

Ctrl + s? ? ? ?保存

d? ? ? ? ? ? ? ? 下一張

a? ? ? ? ? ? ? ? 上一張

Delete? ? ? ? 刪除框

Crtl + e? ? ? 修改標簽名

然后我們寫 fruits.yaml?# 水果識別數據集配置(注意是文件中寫的是相對路徑)

# 訓練和驗證數據集路徑(相對于YOLOv5目錄)
path: ../dataset  # 數據集根目錄
train: images/train  # 訓練圖像路徑(相對于path)
val: images/val  # 驗證圖像路徑(相對于path)# 類別
nc: 5  # 類別數量
names: ['apple', 'banana', 'orange', 'strawberry', 'kiwi']  # 類別名稱

遷移訓練

運行訓練腳本 train_fruis.py

import os
import argparse
import torch
import shutildef train_yolo(epochs=100, batch_size=16, img_size=640, weights='yolov5s.pt'):"""使用YOLOv5進行水果識別的遷移學習"""print(f"開始訓練水果識別模型,訓練輪次:{epochs},批次大小:{batch_size},圖像尺寸:{img_size}")# 確保我們在正確的工作目錄os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'yolov5'))# 訓練命令train_cmd = f"python train.py --img {img_size} --batch {batch_size} --epochs {epochs} --data ../dataset/fruits.yaml --weights {weights} --cache"# 執行訓練print(f"執行命令: {train_cmd}")os.system(train_cmd)# 復制訓練結果到models目錄last_model = os.path.join('runs', 'train', 'exp', 'weights', 'last.pt')best_model = os.path.join('runs', 'train', 'exp', 'weights', 'best.pt')if os.path.exists(last_model):print("復制模型到models目錄...")os.makedirs('../models', exist_ok=True)shutil.copy(last_model, '../models/fruits_last.pt')if os.path.exists(best_model):shutil.copy(best_model, '../models/fruits_best.pt')print("訓練完成!模型已保存到models目錄。")def parse_arguments():parser = argparse.ArgumentParser(description='YOLO水果識別遷移學習')parser.add_argument('--epochs', type=int, default=100, help='訓練輪次')parser.add_argument('--batch-size', type=int, default=16, help='批次大小')parser.add_argument('--img-size', type=int, default=640, help='圖像尺寸')parser.add_argument('--weights', type=str, default='yolov5s.pt', help='預訓練權重 (yolov5s.pt, yolov5m.pt, yolov5l.pt, yolov5x.pt)')return parser.parse_args()if __name__ == "__main__":args = parse_arguments()train_yolo(epochs=args.epochs, batch_size=args.batch_size, img_size=args.img_size, weights=args.weights)

繼續訓練

如果新增了訓練集的話,直接運行上面的 train_fruits.py 會生成新的模型

如果我們想繼續訓練我們之前的模型

import os
import argparse
import shutildef continue_training(epochs=50, batch_size=16, img_size=640, weights='models/fruits_best.pt'):"""使用已訓練的水果模型繼續訓練(增量學習)"""print(f"使用已訓練的模型繼續訓練水果識別模型,訓練輪次:{epochs},批次大小:{batch_size}")# 確保我們在正確的工作目錄os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'yolov5'))# 檢查指定的權重文件是否存在weights_path = os.path.join('..', weights) if not os.path.isabs(weights) else weightsif not os.path.exists(weights_path):print(f"錯誤:找不到指定的權重文件:{weights_path}")print("如果這是您第一次訓練,請使用train_fruits.py腳本,或者指定yolov5s.pt作為起點")return False# 訓練命令 - 使用之前訓練的模型繼續訓練train_cmd = f"python train.py --img {img_size} --batch {batch_size} --epochs {epochs} --data ../dataset/fruits.yaml --weights {weights_path} --cache"# 執行訓練print(f"執行命令: {train_cmd}")os.system(train_cmd)# 復制訓練結果到models目錄last_model = os.path.join('runs', 'train', 'exp', 'weights', 'last.pt')best_model = os.path.join('runs', 'train', 'exp', 'weights', 'best.pt')if os.path.exists(last_model):print("復制更新后的模型到models目錄...")os.makedirs('../models', exist_ok=True)shutil.copy(last_model, '../models/fruits_continued_last.pt')if os.path.exists(best_model):shutil.copy(best_model, '../models/fruits_continued_best.pt')print("增量訓練完成!更新后的模型已保存到models目錄。")return Truedef parse_arguments():parser = argparse.ArgumentParser(description='YOLO水果識別增量訓練')parser.add_argument('--epochs', type=int, default=50, help='訓練輪次')parser.add_argument('--batch-size', type=int, default=16, help='批次大小')parser.add_argument('--img-size', type=int, default=640, help='圖像尺寸')parser.add_argument('--weights', type=str, default='models/fruits_best.pt', help='之前訓練好的模型權重文件路徑')return parser.parse_args()if __name__ == "__main__":args = parse_arguments()continue_training(epochs=args.epochs, batch_size=args.batch_size, img_size=args.img_size, weights=args.weights)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79950.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79950.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LangChain框架-PromptTemplate 詳解

摘要 本文聚焦于 LangChain 框架中PromptTemplate提示詞模板模塊的深度解析,主要參考langchain_core.prompts源碼模塊與官方文檔。系統梳理 LangChain 對提示詞模板的封裝邏輯與設計思路,旨在幫助讀者構建全面、深入的知識體系,為高效運用LangChain 框架的提示詞模板開發應用…

中小企業設備預測性維護三步構建法:從零到精的技術躍遷與中訊燭龍實踐

在工業4.0浪潮中,中小企業常陷入"設備故障頻發"與"數字化成本高企"的雙重困境。本文基于半導體、食品加工等行業實證數據,結合中訊燭龍系統技術突破,為中小企業提供一套零基礎、低門檻、可擴展的預測性維護實施框架&…

C30-函數

一 函數的優點 避免代碼冗長模塊化的設計思路(十分類似組裝電腦)按功能劃分,每個函數代表一個功能 二 函數的三要素 函數要先定義再使用(就像是變量一樣)三要素: 函數名→體現功能參數列表 比如yf(x)→x就是參數又如yf(x,y)→x,y就是參數→參數的個數取決于需求 返回值:比如…

【Spring Boot 多模塊項目】@MapperScan失效、MapperScannerConfigurer 報錯終極解決方案

在使用 Spring Boot 構建多模塊項目,集成 MyBatis-Plus 時,很多開發者會遇到類似如下啟動報錯: Error creating bean with name mapperScannerConfigurer ... Caused by: java.lang.IllegalArgumentException: Property basePackage is requ…

pimpl與unique_ptr的問題

PImpl與std::unique_ptr組合 pimpl(Pointer to Implementation)是C程序開發中非常常用的技巧之一,它的好處有: 節省程序編譯時間保持程序/庫的二進制兼容性隱藏實現細節 舉例一個常見的pimpl的使用示例: // a.h class Impl; //前置聲明 c…

C++類和對象:構造函數、析構函數、拷貝構造函數

引言 介紹:C類和對象:構造函數、析構函數、拷貝構造函數 _涂色_博主主頁 C基礎專欄 一、類的默認成員函數 先認識一下類中的默認成員函數: 默認成員函數就是用戶沒有顯式實現,編譯器會自動生成的成員函數稱為默認成員函數。?個類…

CTF - PWN之ORW記錄

CTF - Pwn之ORW記錄https://mp.weixin.qq.com/s/uiRtqCSopn6U6NqyKJ8I7Q

RabbitMQ 中的六大工作模式介紹與使用

文章目錄 簡單隊列(Simple Queue)模式配置類定義消費者定義發送消息測試消費 工作隊列(Work Queues)模式配置類定義消費者定義發送消息測試消費負載均衡調優 發布/訂閱(Publish/Subscribe)模式配置類定義消…

民宿管理系統6

普通管理員管理&#xff1a; 新增普通管理員&#xff1a; 前端效果&#xff1a; 前端代碼&#xff1a; <body> <div class"layui-fluid"><div class"layui-row"><div class"layui-form"><div class"layui-f…

vue3+ant design vue + Sortable實現多級表格列拖動

1、最近遇到個需求&#xff0c;需使用vue3ant design vue Sortable實現多級表格的表頭允許用戶拖拽移動。即當用戶拖拽一級表頭時&#xff0c;其對應的子級表頭及數據應同步移動&#xff0c;并且只允許一級非固定表頭允許拖拽。 2、代碼 <a-table:data-source"rowDat…

第五十四篇 AI與數據分析

一、AI數據分析就像做菜 想象你在廚房做一道新菜&#xff0c;AI數據分析的流程其實非常相似&#xff1a; 買菜&#xff08;獲取數據&#xff09; 去市場挑選新鮮蔬菜 從Excel/數據庫獲取數據例&#xff1a;pd.read_csv(超市銷售表.csv) 洗菜切菜&#xff08;清洗數據&#x…

差分OPA verilogaA 模型

做電路設計&#xff0c;需要提前用理想模型如VerilogA模型做驗證。這里分享一個由ahdlib庫里單端opamp改造而來的差分opamp。參考何樂年的《模擬集成電路設計與仿真》10.4節423頁&#xff1b; 描述的小信號模型如上。 VerilogA 用到了SRI/C&#xff0c;GBWgm/C,gaingm*r1等概念…

Solidity語言基礎:區塊鏈智能合約開發入門指南

一、Solidity概述 Solidity是以太坊生態系統中最重要的智能合約編程語言&#xff0c;由Gavin Wood于2014年提出。作為面向合約的高級語言&#xff0c;它結合了JavaScript、Python和C的語法特點&#xff0c;專為在以太坊虛擬機&#xff08;EVM&#xff09;上運行而設計。 核心…

開啟智能Kubernetes管理新時代:kubectl-ai讓操作更簡單!

在如今的科技世界中,Kubernetes 已經成為容器編排領域的標桿,幾乎所有現代應用的基礎設施都離不開它。然而,面對復雜的集群管理和日常運維,許多開發者常常感到無所適從。今天,我們將為大家介紹一款結合了人工智能的強大工具——kubectl-ai。它不僅能幫助開發者更加順暢地與…

2003-2020年高鐵站開通時間數據

2003-2020年高鐵站開通時間數據 1、時間&#xff1a;2003-2020年 2、來源&#xff1a;Chinese High-speed Rail and Airline Database&#xff0c;CRAD 3、指標&#xff1a;高鐵站名稱、開通時間、所在省份、所在城市、所屬線路名稱 4、說明&#xff1a; Hsrwsnm[高鐵站名…

神經網絡—感知器、多層感知器

文章目錄 前言一、生物神經元與感知器的類比二、感知器1、簡單感知器2、多層感知器&#xff08;1&#xff09;多層感知機結構 3、神經網絡結構 總結1、感知器的局限性如何突破感知器的局限性&#xff1f; 2、感知器的應用 前言 感知器&#xff08;Perceptron&#xff09;是神經…

避免數據丟失:在存儲測試數據之前,要做好Redis持久化

Redis提供兩種持久化方法&#xff1a; 一、RDB&#xff08;Redis DataBase&#xff09;&#xff1a; 1、周期性保存內存快照到磁盤&#xff08;生成 dump.rdb 文件&#xff09;。 2、配置save 相關參數。 我本地的配置如下&#xff1a; &#xff08;1&#xff09;配置文件re…

Oracle EBS FORM快捷鍵與觸發器的關系與使用

Oracle EBS FORM快捷鍵與觸發器的引用 1、快捷鍵作用&#xff0c;可以看文檔fmrweb.res 2、文件內容&#xff1a;標識了快捷鍵的作用 9 : 0 : “Tab” : 1 : “Next Field” 9 : 1 : “ShiftTab” : 2 : “Previous Field” 116 : 0 : “F5” : 3 : “Clear Field” 38 : 0 :…

Java 24:重構數字信任邊界 —— 后量子時代的智能安全防御體系構建

引言 在量子計算陰影與 AI 驅動攻擊交織的網絡安全新紀元&#xff0c;Java 平臺正經歷著自誕生以來最深刻的安全架構革新。作為企業級應用的核心基礎設施&#xff0c;Java 24 不僅延續了 “一次編寫&#xff0c;處處運行” 的跨平臺基因&#xff0c;更以后量子密碼學引擎、動態…

【故障定位系列】容器CPU問題引起的故障如何快速排查

原文地址&#xff1a;https://mp.weixin.qq.com/s/0VlIjbeEdPZUbLD389disA 當生產環境中的容器CPU出現異常時&#xff0c;可能會引發上層業務出現一系列問題&#xff0c;比如業務請求緩慢、網頁卡頓甚至崩潰等&#xff0c;如果沒有一個有效的故障定位方法&#xff0c;運維人員很…