使用yolo11訓練食物浪費檢測數據集VOC+YOLO格式6734張32類別步驟和流程

【數據集介紹】

數據集格式:Pascal VOC格式+YOLO格式(不包含分割路徑的txt文件,僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件)

圖片數量(jpg文件個數):6734

標注數量(xml文件個數):6734

標注數量(txt文件個數):6734

標注類別數:32

所在倉庫:firc-dataset

標注類別名稱(注意yolo格式類別順序不和這個對應,而以labels文件夾classes.txt為準):["Apple","Apple-core","Apple-peel","Bone","Bone-fish","Bread","Bun","Egg-hard","Egg-scramble","Egg-shell","Egg-steam","Egg-yolk","Fish","Meat","Mussel","Mussel-shell","Noodle","Orange","Orange-peel","Other-waste","Pancake","Pasta","Pear","Pear-core","Pear-peel","Potato","Rice","Shrimp","Shrimp-shell","Tofu","Tomato","Vegetable"]

每個類別標注的框數:

Apple 框數 = 1354

Apple-core 框數 = 759

Apple-peel 框數 = 1612

Bone 框數 = 4379

Bone-fish 框數 = 722

Bread 框數 = 928

Bun 框數 = 36

Egg-hard 框數 = 37

Egg-scramble 框數 = 20

Egg-shell 框數 = 3811

Egg-steam 框數 = 98

Egg-yolk 框數 = 784

Fish 框數 = 138

Meat 框數 = 1020

Mussel 框數 = 27

Mussel-shell 框數 = 86

Noodle 框數 = 538

Orange 框數 = 2512

Orange-peel 框數 = 2194

Other-waste 框數 = 152

Pancake 框數 = 33

Pasta 框數 = 9

Pear 框數 = 1186

Pear-core 框數 = 272

Pear-peel 框數 = 404

Potato 框數 = 140

Rice 框數 = 873

Shrimp 框數 = 13

Shrimp-shell 框數 = 48

Tofu 框數 = 20

Tomato 框數 = 71

Vegetable 框數 = 4170

總框數:28446

使用標注工具:labelImg

標注規則:對類別進行畫矩形框

重要說明:暫無

圖片分辨率:640x640

特別聲明:本數據集不對訓練的模型或者權重文件精度作任何保證

圖片預覽:

標注例子:

【訓練步驟】

這里以yolo11訓練為例。首先我們獲取數據集壓縮包7z格式或者zip格式后解壓到一個非中文或者有空格路徑下面。比如解壓到C:\Users\Administrator\Downloads目錄,下面都是以這個目錄演示訓練流程。

然后我們在數據集data文件夾下面新建一個腳本split.py寫入下面代碼:

import os
import shutil
import randomclass VOCDataSplit(object):def __init__(self):passdef split(self, image_dir, label_dir, save_dir, trainval_radio=0.9, train_radio=0.9, copy_it=True,need_test_dataset=False, shuffle_file=True):train_images_dir = os.path.join(save_dir, 'train', 'images')train_labels_dir = os.path.join(save_dir, 'train', 'labels')val_images_dir = os.path.join(save_dir, 'val', 'images')val_labels_dir = os.path.join(save_dir, 'val', 'labels')test_images_dir = os.path.join(save_dir, 'test', 'images')test_labels_dir = os.path.join(save_dir, 'test', 'labels')os.makedirs(train_images_dir, exist_ok=True)os.makedirs(train_labels_dir, exist_ok=True)os.makedirs(val_images_dir, exist_ok=True)os.makedirs(val_labels_dir, exist_ok=True)if need_test_dataset:os.makedirs(test_images_dir, exist_ok=True)os.makedirs(test_labels_dir, exist_ok=True)files = []for file in os.listdir(image_dir):if file.endswith('.jpg'):files.append(file)total_count = len(files)print('find {} images'.format(total_count))if shuffle_file:random.shuffle(files)if need_test_dataset:test_count = int(total_count * (1 - trainval_radio))train_count = int((total_count - test_count) * train_radio)val_count = total_count - test_count - train_countelse:train_count = int(total_count * train_radio)val_count = total_count - train_counttest_count = 0print('train={},val={},test={}'.format(train_count, val_count, test_count))train_files = files[:train_count]val_files = files[train_count:train_count + val_count]test_files = files[train_count + val_count:]print('start copy or move train files...')for file in train_files:if copy_it:shutil.copy(os.path.join(image_dir, file), os.path.join(train_images_dir, file))label_file = os.path.join(label_dir, file[:-3] + 'txt')if os.path.exists(label_file):shutil.copy(label_file, os.path.join(train_labels_dir, file[:-3] + 'txt'))else:shutil.move(os.path.join(image_dir, file), os.path.join(train_images_dir, file))label_file = os.path.join(label_dir, file[:-3] + 'txt')if os.path.exists(label_file):shutil.move(label_file, os.path.join(train_labels_dir, file[:-3] + 'txt'))print('start copy or move val files...')for file in val_files:if copy_it:shutil.copy(os.path.join(image_dir, file), os.path.join(val_images_dir, file))label_file = os.path.join(label_dir, file[:-3] + 'txt')if os.path.exists(label_file):shutil.copy(label_file, os.path.join(val_labels_dir, file[:-3] + 'txt'))else:shutil.move(os.path.join(image_dir, file), os.path.join(val_images_dir, file))label_file = os.path.join(label_dir, file[:-3] + 'txt')if os.path.exists(label_file):shutil.move(label_file, os.path.join(val_labels_dir, file[:-3] + 'txt'))if need_test_dataset and test_count > 0:print('start copy or move test files...')for file in test_files:if copy_it:shutil.copy(os.path.join(image_dir, file), os.path.join(test_images_dir, file))label_file = os.path.join(label_dir, file[:-3] + 'txt')if os.path.exists(label_file):shutil.copy(label_file, os.path.join(test_labels_dir, file[:-3] + 'txt'))else:shutil.move(os.path.join(image_dir, file), os.path.join(test_images_dir, file))label_file = os.path.join(label_dir, file[:-3] + 'txt')if os.path.exists(label_file):shutil.move(label_file, os.path.join(test_labels_dir, file[:-3] + 'txt'))class_file=os.path.join(label_dir, 'classes.txt')if os.path.exists(class_file):class_names=[]with open(class_file, 'r') as f:class_names=f.read().rstrip('\n').split('\n')nc = len(class_names)content='train: '+train_images_dir+'\n'content += 'val: '+val_images_dir+'\n'if need_test_dataset:content += 'test: '+test_images_dir+'\n'content += 'nc: '+str(nc)+'\n'content += 'names:\n'content += "\n".join([f"  {i}: {name}" for i, name in enumerate(class_names)])with open(os.path.join(save_dir,'coco128.yaml'), 'w') as f:f.write(content)print('all done!')
if __name__ == '__main__':images_dir=r'C:\Users\Administrator\Downloads\data\JPEGImages'labels_dir=r'C:\Users\Administrator\Downloads\data\labels'save_dir=r'C:\Users\Administrator\Downloads\dataset'vs = VOCDataSplit()vs.split(images_dir,labels_dir,save_dir,trainval_radio=0.9, train_radio=0.9, copy_it=True,shuffle_file=True,need_test_dataset=False)

?注意?images_dir,labels_dir,save_dir根據自己實際情況進行調整。這個split.py腳本功能就是將JPEGImages和labels文件進行自動隨機分割成標準yolo訓練目錄格式。腳本放在data文件夾下面即可:

然后運行腳本:

然后在C:\Users\Administrator\Downloads看到有個dataset文件夾生成?

至此標準訓練格式完成了。打開coco128.yaml看到下面類似格式:

train: C:\Users\Administrator\Downloads\dataset\train\images
val: C:\Users\Administrator\Downloads\dataset\val\images
nc: 32
names:0: Apple1: Apple-core2: Apple-peel3: Bone4: Bone-fish5: Bread6: Bun7: Egg-hard8: Egg-scramble9: Egg-shell10: Egg-steam11: Egg-yolk12: Fish13: Meat14: Mussel15: Mussel-shell16: Noodle17: Orange18: Orange-peel19: Other-waste20: Pancake21: Pasta22: Pear23: Pear-core24: Pear-peel25: Potato26: Rice27: Shrimp28: Shrimp-shell29: Tofu30: Tomato31: Vegetable

?這些都不用修改,我們只需要檢查一下是不是對的就行。

之后就是開始訓練了,注意訓練yolov8模型需要自己提前安裝好環境。

使用預訓練模型開始訓練

yolo task=detect mode=train model=yolo11n.pt data=coco128.yaml epochs=100 imgsz=640 batch=8 workers=2

參數說明:

model: 使用的模型類型,如 yolo11s.pt(小模型)、yolo11m.pt(中)、yolo11l.pt(大)
data: 指定數據配置文件
epochs: 訓練輪數
imgsz: 輸入圖像尺寸
batch: 批量大小(根據顯存調整)

workers:指定進程數(windows最好設置0或者1或2,linux可以設置8)
訓練完成后,最佳權重保存路徑為:runs/detect/train/weights/best.pt,如果多次運行命令runs/detect/train2,runs/detect/train3文件夾生成只需要到數字最大文件夾查看就可以找到模型

圖片預測:

from ultralytics import YOLO# 加載訓練好的模型
model = YOLO('runs/detect/train/weights/best.pt')# 圖像預測
results = model('path_to_your_image.jpg')

視頻或攝像頭預測

results = model('path_to_video.mp4')  # 視頻
#results = model(0)  # 攝像頭

?驗證集評估

yolo task=detect mode=val model=runs/detect/train/weights/best.pt data=data.yaml

輸出指標圖像,一般在模型訓練后生成,文件位置在runs/detect/train/results.png:

上面訓練結果圖片常用評估參數介紹

【常用評估參數介紹】

在目標檢測任務中,評估模型的性能是至關重要的。你提到的幾個術語是評估模型性能的常用指標。下面是對這些術語的詳細解釋:

  1. Class
    • 這通常指的是模型被設計用來檢測的目標類別。例如,一個模型可能被訓練來檢測車輛、行人或動物等不同類別的對象。
  2. Images
    • 表示驗證集中的圖片數量。驗證集是用來評估模型性能的數據集,與訓練集分開,以確保評估結果的公正性。
  3. Instances
    • 在所有圖片中目標對象的總數。這包括了所有類別對象的總和,例如,如果驗證集包含100張圖片,每張圖片平均有5個目標對象,則Instances為500。
  4. P(精確度Precision)
    • 精確度是模型預測為正樣本的實例中,真正為正樣本的比例。計算公式為:Precision = TP / (TP + FP),其中TP表示真正例(True Positives),FP表示假正例(False Positives)。
  5. R(召回率Recall)
    • 召回率是所有真正的正樣本中被模型正確預測為正樣本的比例。計算公式為:Recall = TP / (TP + FN),其中FN表示假負例(False Negatives)。
  6. mAP50
    • 表示在IoU(交并比)閾值為0.5時的平均精度(mean Average Precision)。IoU是衡量預測框和真實框重疊程度的指標。mAP是一個綜合指標,考慮了精確度和召回率,用于評估模型在不同召回率水平上的性能。在IoU=0.5時,如果預測框與真實框的重疊程度達到或超過50%,則認為該預測是正確的。
  7. mAP50-95
    • 表示在IoU從0.5到0.95(間隔0.05)的范圍內,模型的平均精度。這是一個更嚴格的評估標準,要求預測框與真實框的重疊程度更高。在目標檢測任務中,更高的IoU閾值意味著模型需要更準確地定位目標對象。mAP50-95的計算考慮了從寬松到嚴格的多個IoU閾值,因此能夠更全面地評估模型的性能。

這些指標共同構成了評估目標檢測模型性能的重要框架。通過比較不同模型在這些指標上的表現,可以判斷哪個模型在實際應用中可能更有效。

將模型導出為ONNX、TensorRT等格式以用于部署:

yolo export model=runs/detect/train/weights/best.pt format=onnx
支持格式包括:onnx, engine, tflite, pb, torchscript 等。

經過上面訓練可以使用模型做進一步部署,比如使用onnx模型在嵌入式部署,使用engine模型在jetson上deepstream部署,使用torchscript模型可以在C++上部署等等。

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

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

相關文章

掌握PowerPC架構與編程技巧:技術資料詳解

本文還有配套的精品資源,點擊獲取 簡介:PowerPC是一種高性能的RISC架構,最初由IBM、Motorola和Apple聯合開發,被設計用于高端工作站和服務器,同時廣泛應用于嵌入式系統、航空電子設備、游戲主機和超級計算機等領域。…

VR 企業展廳:開啟數字化展示新時代

在當今數字化浪潮席卷各行各業的時代,企業的展示與宣傳方式也在不斷革新。VR(虛擬現實)技術的出現,為企業展廳帶來了全新的變革,使其從傳統的實體展示空間,轉變為具有無限可能的數字化虛擬空間。一、VR 企業…

測試用例顆粒度全解析

引言:為什么顆粒度是測試團隊的“隱形門檻”?在軟件測試領域,測試用例顆粒度(即測試用例的詳細程度)看似是一個基礎問題,卻常常成為團隊協作的“隱形門檻”。某電商平臺測試團隊曾出現過這樣的窘境&#xf…

分布式鎖的基本原理和基于lua腳本的實現(Redisson)

為了確保分布式鎖可用,我們要確保鎖的實現同時滿足以下四個條件:- 互斥性。在任意時刻,只有一個客戶端能持有鎖。- 不會發生死鎖。即使有一個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證后續其他客戶端能加鎖。- 解鈴還須系…

智慧園區數字孿生全生命周期交付體系:從虛擬建模到全域智聯的快速交付新常態

在數字經濟與綠色低碳轉型的雙重驅動下,智慧園區建設正經歷從“物理空間堆砌”到“數據智能驅動”的范式革命。數字孿生技術作為核心引擎,通過構建物理園區的虛擬鏡像,實現虛實空間的毫秒級同步與智能協同,推動園區管理向全要素感…

電腦忘記開機密碼怎么辦?【圖文詳解】5種方法重置/更改/取消/設置開機密碼?

一、問題背景誰都有馬虎的時候,要是突然忘了電腦開機密碼,就只能對著登錄界面干著急,沒法打開電腦處理工作、查看文件,太影響效率了。別慌,其實有不少簡單實用的辦法能解除或重置密碼,下面就來一一介紹&…

Go語言select

select是什么select是Go語言層面提供的一種多路復用機制,用于檢測當前goroutine連接的多個channel是否有數據準備完畢,可用于讀或寫。Go語言的select語句,是用來起一個goroutine監聽多個Channel的讀寫事件,提高從多個Channel獲取信…

VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-整體示例

一、注冊、登錄、密碼找回二、VUE前臺系統三、VUE后臺系統

深入解析SmolVLA:VLM與動作專家間的注意力機制交互

在機器人學習領域,如何有效地將視覺語言模型(VLM)的強大感知能力與低級動作控制相結合,是實現通用機器人智能的關鍵挑戰。SmolVLA(Small Vision-Language-Action)架構正是在這一背景下應運而生,…

Spring Security 認證與授權實現機制

Spring Security 是一個功能強大且高度可定制的身份驗證和訪問控制框架,其認證和授權實現機制如下:一、認證(Authentication)實現 1. 核心組件 AuthenticationManager:認證入口點,委托給AuthenticationProviderAuthenticationProv…

開源的時間跟蹤工具TimeTagger

簡介 什么是 TimeTagger ? TimeTagger 是一個開源的時間跟蹤工具,旨在幫助用戶記錄和分析他們的時間使用情況。它提供了一個互動的用戶界面和強大的報告功能,適合個人和自由職業者使用。 主要特點 直觀的用戶界面:基于互動時間線…

學習游戲制作記錄(角色屬性和狀態腳本)8.4

1.實現簡單的角色屬性創建CharactorState腳本:掛載在敵人和玩家身上public float damage;//角色傷害public float maxHp;//最大生命[SerializeField] private float currentHealth;//當前生命void Start(){currentHealth maxHp;//初始化將當前生命設置為最大生命}p…

04-Chapter02-Example01

文章介紹 1、完善項目結構 1.1 新建第二章對應模塊Chapter021.2 新建模塊Chapter02對應包com.itheima1.3 在包com.itheima下新建class類 ,類名稱Example01.java項目結構如下:2、編寫Example01.java代碼 P38 package com.itheima;public class Example01…

【達夢MPP(帶主備)集群搭建】

達夢MPP(帶主備)集群搭建 為了提高MPP系統可靠性,克服由于單節點故障導致整個系統不能繼續正常工作的問題,DM在普通的MPP系統基礎上,引入數據守護主備機制,為每一個MPP節點配置一個實時備庫作為備份節點&a…

Java基礎學習(一):類名規范、返回值、注釋、數據類型

目錄 一、類名規范二、返回值三、注釋四、數據類型 1. 基本類型2. 引用類型3. 強制數據類型轉換4. 進制5. 進制的轉換6. 超范圍運算 相關文章 Java基礎學習(二):Java中的變量和常量、final(重點)、運算、字符串 了…

Nginx相關實驗(2)

nginx的一些高級配置 nginx狀態頁 基于nginx 模塊 ngx_http_stub_status_module 實現, 在編譯安裝nginx的時候需要添加編譯參數 --with-http_stub_status_module 否則配置完成之后監測會是提示語法錯誤 #檢查模塊是否配置 如果不存在需要添加模塊重新編譯 nginx …

2.Java和C++有什么區別

2.Java和C有什么區別 1.在C中,支持操作符重載,而在Java里是不允許的 2.C支持多繼承,而Java不可以,但Java可以單繼承多實現 3.Java內置多線程機制,而C沒有 4.Java里面自帶了垃圾回收機制,可以自動清理緩存等…

MLIR Introduction

簡介 MLIR 項目是一個構建可重用和可擴展編譯器基礎設施創新項目,旨在解決軟件碎片化問題,顯著降低構建特定領域編譯器的成本。 基于MLIR,可以實現: 數據流圖表達(如TensorFlow),包含dynamic…

[找出字符串中第一個匹配項的下標]

代碼思路分析: 1. 邊界情況處理 代碼中沒有顯式處理以下邊界情況,但邏輯已隱含支持: needle 為空字符串:應返回 0(但題目通常保證 needle 非空)。haystack 比 needle 短:直接返回 -1&#xff08…

深入剖析RT-Thread串口驅動:基于STM32H750的FinSH Shell全鏈路Trace分析與實戰解密(上)

0. 概述 這是cherryusb代碼trace分析系列文章之七。 RT-Thread串口驅動框架與FinSH Shell運行機制深度解析:針對STM32H750 ART-PI平臺,本文獨辟蹊徑采用創新的代碼trace分析方法,破解龐大串口框架下的復雜運行邏輯。通過精確trace日志與drv_u…