航空發動機葉片yolov8模型訓練和轉換(包含適配rk3588-pt轉onnx轉rknn)

前言:

1.訓練在windows進行,因為電腦沒有顯卡,所以純cpu訓練,生成pt后轉onnx

2.onnx轉需要在Ubuntu虛擬機上運行

3.數據集標定快捷鍵

(模型訓練時不需要)官方地址和下載pt權重:鏈接:https://github.com/ultralytics/ultralytics/tree/v8.0.4?tab=readme-ov-file

必須要下載模型,在源碼頁面找到模型點擊下載,推薦下載yolov8n.pt

環境配置

參考鏈接:(32 封私信 / 80 條消息) yolov8環境配置加訓練自己的數據集保姆級教程(2024) - 知乎

yolov8訓練自己的目標檢測數據集詳細介紹版-騰訊云開發者社區-騰訊云

1.安裝anaconda Index of /archive

打開anaconda prompt(管理員運行)

conda create -n yolov8 python=3.8 -y  創建環境,建議3.8
conda activate yolov8  激活環境
conda deactivate 退出環境
conda env remove --name yolov8
conda remove --name yolov8 --all 刪除環境然后安裝pytorch如果安裝GPU版本可以用下面命令:pip install torch2.0.0+cu118 torchvision0.15.1+cu118 --extra-index-url https://download.pytorch.org/whl/cu118如果安裝CPU版本pytorch可以用下面命令:conda install pytorch torchvision torchaudio cpuonly -c pytorch安裝yolov8:pip install ultralytics測試  下載yolov8n.pt和隨機圖片yolo predict model=yolov8n.pt source=test.jpgpip install labelimg  //安裝labelimg,會自動安裝pyqt5,或者在pycharm命令行安裝和打開labelimg

制作自己的數據集(本人是訓練航空發動機劃痕和缺陷)

1.新建文件夾

在data文件夾里面新建一個datasets再在里面新建四個文件夾分別是

Annotations(存放xml的文件夾)

images(用來存放原始的需要訓練的數據集圖片,圖片格式為jpg格式)

ImageSets(用來存放將數據集劃分后的用于訓練、驗證、測試的文件)

labels(存放yolo轉換的txt文件)。

我用了兩個分類

scratch (劃痕)

fracture 斷裂

使用說明:

(1)Open Dir就是打開需要標注的圖片的文件夾,這里就選擇images文件夾

(2)change save dir就是標注后保存標記文件的位置,選擇需要保存標注信息的文件夾,這里就選擇Annotations文件夾

(3)特別注意需要選擇好所需要的標注文件的類型。有yolo(txt), pascalVOC (xml)兩種類型。yolo需要txt文件格式的標注文件,但是這里我們選擇pascalVOC,后面再將xml格式的標注文件轉化為所需的txt格式。

(4)按W鍵或點擊Create\nRectBox開始創建矩形框,把要進行識別訓練的區域標記出來就行,選好框后我們選是什么類別(predefined_classes文件,在里面提前寫好要訓練的類型的原因),整張圖片的所有目標都標記好了之后按Ctrl+S或點擊Save保存 ,然后切換下一張繼續,快捷鍵為按D鍵,每一張圖片標記后都要保存,這個過程是一個比較繁瑣的過程

2.標注

如何預設標簽

1.找到anaconda安裝的根目錄:D:\anaconda

2.進入路徑D:\anaconda\Lib\site-packages\labelImg

注意如果你安裝其他環境需要對應自己環境,比如我的是py38環境里面則需進去D:\anaconda3\envs\yolov8\Lib\site-packages\labelImg。

3.在此路徑里面創建data文件夾,并將自己的predefined_classes.txt文件放入到data文件夾中。

labelImg如何設置多個預設標簽

labelImg如何設置多個預設標簽_51CTO博客_labelimg標簽怎么設置

劃分數據集進行訓練

博主建議將腳本放在ultralytics文件夾的同級下(我第一次操作沒有放到同級目錄,一樣沒問題

因為在YOLOv8的項目中,存在一個ultralytics文件夾,而我們在配置環境的時候,又有名為ultralytics的環境包,二者存在歧義,導致我們在ultralytics文件夾中進行參數修改后卻不生效的情況,(這時如果仍要通過命令行進行訓練,必須要在環境配置文件中進行相應修改),比如更改激活函數后,發現得到的PT模型仍為最初的SiLU激活函數,這是因為命令行會優先調用環境配置文件中的參數,所以在ultralytics文件夾中修改激活函數后并不會生效(博主自己踩坑,請大家避免)。

3.最重要的一點:要改激活函數為ReLU(問deepseek說可以不用改,我也沒改),

改激活函數流程如下:把ultralytics/nn/modules/conv.py中的Conv類進行修改,將

default_act = nn.SiLU() # default activation改為

default_act = nn.ReLU() # default activation

對數據集進行劃分
import os
import shutil
import randomdef make_yolo_dataset(images_folder, labels_folder, output_folder, train_ratio=0.8):# 創建目標文件夾images_train_folder = os.path.join(output_folder, 'images/train')images_val_folder = os.path.join(output_folder, 'images/val')labels_train_folder = os.path.join(output_folder, 'labels/train')labels_val_folder = os.path.join(output_folder, 'labels/val')os.makedirs(images_train_folder, exist_ok=True)os.makedirs(images_val_folder, exist_ok=True)os.makedirs(labels_train_folder, exist_ok=True)os.makedirs(labels_val_folder, exist_ok=True)# 獲取圖片和標簽的文件名(不包含擴展名)image_files = [f for f in os.listdir(images_folder) if f.endswith('.jpg')]label_files = [f for f in os.listdir(labels_folder) if f.endswith('.txt')]image_base_names = set(os.path.splitext(f)[0] for f in image_files)label_base_names = set(os.path.splitext(f)[0] for f in label_files)# 找出圖片和標簽都存在的文件名matched_files = list(image_base_names & label_base_names)# 打亂順序并劃分為訓練集和驗證集random.shuffle(matched_files)split_idx = int(len(matched_files) * train_ratio)train_files = matched_files[:split_idx]val_files = matched_files[split_idx:]# 移動文件到對應文件夾for base_name in train_files:img_src = os.path.join(images_folder, f"{base_name}.jpg")lbl_src = os.path.join(labels_folder, f"{base_name}.txt")img_dst = os.path.join(images_train_folder, f"{base_name}.jpg")lbl_dst = os.path.join(labels_train_folder, f"{base_name}.txt")shutil.copyfile(img_src, img_dst)shutil.copyfile(lbl_src, lbl_dst)for base_name in val_files:img_src = os.path.join(images_folder, f"{base_name}.jpg")lbl_src = os.path.join(labels_folder, f"{base_name}.txt")img_dst = os.path.join(images_val_folder, f"{base_name}.jpg")lbl_dst = os.path.join(labels_val_folder, f"{base_name}.txt")shutil.copyfile(img_src, img_dst)shutil.copyfile(lbl_src, lbl_dst)print("數據集劃分完成!")# 使用示例
images_folder = r'E:\Projects\ultralytics_yolov8-main\data\images'  # 原始圖片文件夾路徑
labels_folder = r'E:\Projects\ultralytics_yolov8-main\data\Annotations'  # 原始標簽文件夾路徑
output_folder = r'E:\Projects\ultralytics_yolov8-main\data\ImageSets'  # 存放結果數據集的文件夾路徑
make_yolo_dataset(images_folder, labels_folder, output_folder)

開始訓練模型

在yolov8根目錄下(也就是官方源碼的ultralytics-main目錄下)創建一個新的data.yaml文件,也可以是其他名字的例如mydata.yaml文件,文件名可以變但是后綴需要為.yaml,內容如下

train: E:\Projects\ultralytics_yolov8-main\data\ImageSets\images\train  # train images (relative to 'path') 128 images
val: E:\Projects\ultralytics_yolov8-main\data\ImageSets\images\val  # val images (relative to 'path') 128 images
test: E:\Projects\ultralytics_yolov8-main\data\ImageSets\images\testnc: 2# Classes
names: ['scratch','fracture']

訓練模型

這是使用官方提供的預訓練權重進行訓練,使用yolov8n.pt,也可以使用yolov8s.pt,模型大小n

新建個train.py文件

from ultralytics import YOLO
#多線程添加代碼
if __name__ == '__main__': model = YOLO('yolov8n.yaml').load('yolov8n.pt')# # 訓練模型 GPU#results = model.train(data='data.yaml', epochs=100, imgsz=640, device=0, workers=2, batch=16, optimizer='SGD', amp=False)# 訓練模型 CPUresults = model.train(data='data.yaml', epochs=100, imgsz=640, device='cpu', workers=2, batch=16, optimizer='SGD',amp=False)

epochs是訓練輪數,可以由少變多看訓練效果,workers和batch根據電腦性能來,如果運行不起來則相應降低,最好為2的n次方。

也可以使用命令行執行訓練 yolo task=detect mode=train model=yolov8n.yaml pretrained=yolov8n.pt data=data.yaml epochs=100 imgsz=640 device=0 workers=2 batch=16 訓練完成后會在源碼目錄runs里面有模型生成,可以進去weights文件夾找到best.pt或者last.pt模型

查看模型激活函數方法如下所示:
from ultralytics import YOLO# 加載自定義訓練的模型
model = YOLO("runs/detect/train/weights/best.pt")# 打印模型結構(查找激活函數)
print(model.model)
首先羅列一下官網提供的全部參數:Model Training with Ultralytics YOLO - Ultralytics YOLO Docs

一些比較常用的傳參:

key

解釋

model

傳入的model.yaml文件或者model.pt文件,用于構建網絡和初始化,不同點在于只傳入yaml文件的話參數會隨機初始化

data

訓練數據集的配置yaml文件

epochs

訓練輪次,默認100

patience

早停訓練觀察的輪次,默認50,如果50輪沒有精度提升,模型會直接停止訓練

batch

訓練批次,默認16

imgsz

訓練圖片大小,默認640

save

保存訓練過程和訓練權重,默認開啟

save_period

訓練過程中每x個輪次保存一次訓練模型,默認-1(不開啟)

cache

是否采用ram進行數據載入,設置True會加快訓練速度,但是這個參數非常吃內存,一般服務器才會設置

device

要運行的設備,即cuda device =0或Device =0,1,2,3或device = cpu

workers

載入數據的線程數。windows一般為4,服務器可以大點,windows上這個參數可能會導致線程報錯,發現有關線程報錯,可以嘗試減少這個參數,這個參數默認為8,大部分都是需要減少的

project

項目文件夾的名,默認為runs

name

用于保存訓練文件夾名,默認exp,依次累加

exist_ok

是否覆蓋現有保存文件夾,默認Flase

pretrained

是否加載預訓練權重,默認Flase

optimizer

優化器選擇,默認SGD,可選[SGD、Adam、AdamW、RMSProP]

verbose

是否打印詳細輸出

seed

隨機種子,用于復現模型,默認0

deterministic

設置為True,保證實驗的可復現性

single_cls

將多類數據訓練為單類,把所有數據當作單類訓練,默認Flase

image_weights

使用加權圖像選擇進行訓練,默認Flase

rect

使用矩形訓練,和矩形推理同理,默認False

cos_lr

使用余弦學習率調度,默認Flase

close_mosaic

最后x個輪次禁用馬賽克增強,默認10

resume

斷點訓練,默認Flase

lr0

初始化學習率,默認0.01

lrf

最終學習率,默認0.01

label_smoothing

標簽平滑參數,默認0.0

dropout

使用dropout正則化(僅對訓練進行分類),默認0.0

模型測試

找到之前訓練的結果保存路徑,創建一個predict.py文件,內容如下

from ultralytics import YOLO
# 加載訓練好的模型,改為自己的路徑
model = YOLO('runs/detect/train/weights/best.pt')
# 修改為自己的圖像或者文件夾的路徑
source = 'test.jpg' #修改為自己的圖片路徑及文件名
# 運行推理,并附加參數
model.predict(source, save=True)

模型轉換

參考鏈接:【YOLOv8部署至RK3588】模型訓練→轉換RKNN→開發板部署_yolov8轉rknn-CSDN博客

需要以下工具:ultralytics_yolov8、rknn_model_zoo、rknn-toolkit2,現在詳細介紹這三者的關系。

以上三個文件均與模型訓練無關,而是用于模型轉換的,其中,ultralytics_yolov8文件不是必需的,但最好還是下載一份,原因后面會講;在此,先將以上三個文件的鏈接放在這:

ultralytics_yolov8:https://github.com/airockchip/ultralytics_yolov8

rknn_model_zoo:https://github.com/airockchip/rknn_model_zoo

rknn-toolkit2:https://github.com/airockchip/rknn-toolkit2

另外說一下這三個文件的版本,全用最新的,rknn_model_zoo用v2.3.2,rknn-toolkit2也用v2.3.2,ultralytics_yolov8只有一個main版本,直接用即可

轉換步驟:

1.修改ultralytics_yolov8項目中的ultralytics/cfg/default.yaml,將其中的model參數路徑改成你訓練得到的的best.pt模型路徑

在虛擬環境下,裝轉換需要的環境
cd ultralytics-main
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install -e .
pip install onnx

新建一個腳本文件:運行后會在?runs\detect\train\weights下生成best.onnx文件

#這里好像是后期轉換rknn,需要導出這樣的
from ultralytics import YOLO# Load a model
model = YOLO(r'E:\Projects\ultralytics_yolov8-main\data\runs\detect\train\weights\best.pt')
# Export the model
model.export(format='rknn',opset=12)#后期直接用onnx,好像用下面的
from ultralytics import YOLO# Load a model
model = YOLO(r'E:\Projects\ultralytics_yolov8-main\data\runs\detect\train\weights\best.pt')# 2. 導出為 ONNX
model.export(format="onnx", opset=12, dynamic=False, simplify=True, imgsz=640)
print("ONNX 模型導出完成!")

同時生成onnx文件,這樣生成的模型output是4維的,后面可以直接轉換成rknn。

如果不在rk3588上用,只用onnx文件,之前測試和使用的模型是output都是三維的,所以上面的代碼是可以生成兩種不同的額模型

onnx轉rknn需要再Ubuntu虛擬機下轉換,篇幅限制,下節再講

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

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

相關文章

PyTorch如何修改模型(魔改)?/替換模型,一般除了注意輸入輸出一致,還有其他要修改的嗎?

一、PyTorch如何修改模型(魔改)? 可以參考這個鏈接,看了一下還不錯: PyTorch如何修改模型(魔改)_模型魔改-CSDN博客 二、替換模型,一般除了注意輸入輸出一致,還有其他要修改的嗎?…

Pycharm Debug詳解

Pycharm Debug詳解看這個工具欄就是 PyCharm 調試器的“步進/斷點”按鈕區。常用按鈕和作用(從左到右一般是這些): Resume / 繼續運行(F9):從當前斷點繼續跑,直到下一個斷點或程序結束。Step Ov…

將SSL配置遷移到Nacos的步驟

將SSL配置遷移到Nacos的步驟 要將SSL配置從本地application.yml遷移到Nacos配置中心,需要完成以下幾個步驟: 1. 創建Nacos配置文件 在Nacos中創建一個新的配置文件(例如application-ssl.yml),內容如下: ser…

HTTP請求參數類型及對應的后端注解

在Java后端開發中,HTTP請求的不同部分需要使用不同的注解來處理。以下是四種主要請求參數類型及其對應的Spring注解:1. 請求頭(Headers)??位置??:HTTP請求的頭部信息??常用場景??:認證信息(Token)、客戶端信息、內容類型等…

服務器硬件電路設計之 SPI 問答(一):解密 SPI—— 從定義到核心特性

在服務器硬件電路設計中,SPI(Serial Peripheral Interface,串行外設接口)是一種關鍵的通信總線。它由摩托羅拉公司開發,是全雙工、同步串行通信總線,主要用于微控制器與外圍設備之間的通信,憑借…

【2025CVPR-目標檢測方向】OW-OVD:統一的開放世界和開放詞匯對象檢測

研究背景與動機? ?問題?:傳統目標檢測器(封閉集)需預定義所有類別,無法適應動態開放環境。現有研究多獨立解決開放詞匯檢測(OVD)或開放世界檢測(OWOD),未結合兩者優勢: ?OVD?:通過文本-視覺嵌入匹配實現零樣本泛化,但無法主動發現未知對象。 ?OWOD?:可主動…

基于Python的就業信息推薦系統 Python+Django+Vue.js

本文項目編號 25011 ,文末自助獲取源碼 \color{red}{25011,文末自助獲取源碼} 25011,文末自助獲取源碼 目錄 一、系統介紹二、系統錄屏三、啟動教程四、功能截圖五、文案資料5.1 選題背景5.2 國內外研究現狀 六、核心代碼6.1 查詢數據6.2 新…

el-date-picker type=daterange 日期范圍限制

html &#xff08;組件&#xff1a;element-ui&#xff09;重點&#xff1a; :picker-options"pickerOptions"<template><el-date-pickerv-model"form.dateRange"type"daterange" value-format"yyyy-MM-dd"range-separator&q…

【38頁PPT】關于5G智慧園區整體解決方案(附下載方式)

篇幅所限&#xff0c;本文只提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2501_92808811/91694207 資料解讀&#xff1a;《關于5G智慧園區整體解決方案》 詳細資料請看本解讀文章的最后內容。 智慧園區行業理解與建設目標 智慧園…

Kafka的ISR、OSR、AR詳解

Kafka中的ISR、OSR和AR是副本管理機制的核心概念&#xff0c;它們共同保障了Kafka的高可用性和數據一致性。下面我將詳細解釋這些概念及其相互關系。 1. 基本概念 1.1 AR (Assigned Replicas) - 分配副本 定義&#xff1a;一個分區的所有副本集合稱為AR&#xff0c;即Kafka為主…

第一階段C#基礎-13:索引器,接口,泛型

1_索引器&#xff08;1&#xff09;索引器是C#中一個強大而實用的特性&#xff0c;允許像訪問數組一樣訪問類的成員&#xff08;2&#xff09;索引器&#xff1a;一種可以讓我們使用索引來訪問對象的一種方法&#xff0c;是一組get,set訪問器&#xff0c;與屬性類似&#xff0c…

SQL-leetcode— 2356. 每位教師所教授的科目種類的數量

2356. 每位教師所教授的科目種類的數量 表: Teacher ----------------- | Column Name | Type | ----------------- | teacher_id | int | | subject_id | int | | dept_id | int | ----------------- 在 SQL 中&#xff0c;(subject_id, dept_id) 是該表的主鍵。 該表…

基于單片機溫控風扇設計/PWM調速風扇/智能風扇

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 該設計基于單片機實現智能溫控風扇系統&#xff0c;通過溫度傳感器實時監測環境溫度&#xff0c;…

【datawhale組隊學習】RAG技術 - TASK02

教程地址&#xff1a;https://github.com/datawhalechina/all-in-rag/ 感謝datawhale的教程&#xff0c;以下筆記大部分內容來自該教程 文章目錄基于LangChain框架的RAG實現初始化設置數據準備索引構建查詢與檢索生成集成低代碼&#xff08;基于LlamaIndex&#xff09;conda ac…

Mitt 事件發射器完全指南:200字節的輕量級解決方案

簡介 Mitt 是一個輕量級的事件發射器庫&#xff0c;體積小巧&#xff08;約 200 字節&#xff09;&#xff0c;無依賴&#xff0c;支持 TypeScript。它提供了簡單而強大的事件發布/訂閱機制&#xff0c;適用于組件間通信、狀態管理等場景。 特點 &#x1f680; 超輕量級&…

數據庫鎖與死鎖-筆記

一、概述 數據庫是一個共享資源,可以供給多個用戶使用。運行多個用戶同時使用一個數據庫的數據系統統稱多用戶數據庫系統。例如,飛機訂票數據庫系統。在這樣的一個系統中,在同一時刻并發運行的事務數可達數百上千個。 當多個用戶并發地存取數據庫時就會產生多個事務同時存…

滲透藝術系列之Laravel框架(二)

任何軟件&#xff0c;都會存在安全漏洞&#xff0c;我們應該將攻擊成本不斷提高&#xff01;?**——服務容器與中間件的攻防博弈**?本文章僅提供學習&#xff0c;切勿將其用于不法手段&#xff01;一、服務容器的"依賴注入陷阱"1.1 接口綁定的"影子服務"…

官網SSO登錄系統的企業架構設計全過程

第一階段&#xff1a;架構愿景與業務架構設計 (Architecture Vision & Business Architecture) 任何架構的起點都必須是業務目標和需求。 1.1 核心業務目標 (Business Goals) 提升用戶體驗&#xff1a;用戶一次登錄&#xff0c;即可無縫訪問集團下所有子公司的官網和應用&a…

2025世界機器人大會:中國制造“人形時代”爆發

2025世界機器人博覽會8月8日在北京亦莊開幕&#xff0c;主題為“讓機器人更智慧&#xff0c;讓具身體更智能”&#xff0c;匯聚全球200余家企業、1500余件展品&#xff0c;其中首發新品超100款&#xff0c;人形機器人整機企業參展數量創同類展會之最。 除了機器人本體外&#…

Oracle 庫定期備份表結構元數據信息至目標端備份腳本

一、背景描述當前 xxx 項目 Oracle 11g RAC 庫缺少 DG&#xff0c;并且日常沒有備份&#xff0c;存在服務器或存儲損壞&#xff0c;數據或表結構存在丟失風險&#xff0c;在和項目組同步后&#xff0c;項目組反饋可對該數據庫定期備份相關結構信息&#xff0c;如存在數據丟失&a…