文章目錄
- 前言
- 一、YOLOv11代碼下載地址
- 1.YOLOv11模型結構圖
- 二、數據集準備
- 1.數據集標注軟件
- 2.voc數據集格式轉換
- 3.數據集劃分
- 4.修改yolo的訓練配置文件
- 三、YOLO環境配置教程
- 1.pytorch環境安裝
- 2.其他依賴安裝
- 四、YOLOv11訓練
- 五、YOLOv11推理
- 六、解決訓練過程中斷怎么繼續上次訓練
- 總結
前言
YOLOv11 由 Ultralytics 團隊在 2024 年 9 月 30 日發布, 最新的 YOLOv11 模型在之前的 YOLO 版本引入了新功能和改進,以進一步提高性能和靈活性。YOLO11 在快速、準確且易于使用,使其成為各種目標檢測和跟蹤、實例分割、圖像分類和姿態估計任務的絕佳選擇。可以看出官網 YOLOv11 在COCO數據集上的性能表現,如下圖所示:
一、YOLOv11代碼下載地址
手把手視頻安裝可以看這個視頻: 視頻安裝教程
官網的源碼下載地址 :官網源碼
官網打不開的話,從我的網盤下載就行,網盤下載地址: YOLOv11原始版本源碼下載,版本為ultralytics-8.3.6,提取碼: ehhs
1.YOLOv11模型結構圖
根據 yolov11.yaml 畫出 yolo 整體結構圖,如下圖所示
二、數據集準備
1.數據集標注軟件
數據集使用標注軟件標注好,我這里推薦兩個標注軟件,一個是 labelimg,另外一個是 labelme,可以在python環境,使用 pip install labelimg 或者 pip install labelme 進行安裝,看你選擇哪個標注工具標注了,我使用 labelimg 標注工具
安裝完成在終端輸入命令啟動標注軟件
下面是軟件界面
設置自動保存標注生成的標注文件
2.voc數據集格式轉換
標注格式如果選擇VOC格式,后面需要代碼轉換格式,如果選擇yolo格式就不用轉換,voc格式轉換yolo格式代碼如下:
import xml.etree.ElementTree as ET
import os, cv2
import numpy as np
from os import listdir
from os.path import joinclasses = []def convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn (x, y, w, h)def convert_annotation(xmlpath, xmlname):with open(xmlpath, "r", encoding='utf-8') as in_file:txtname = xmlname[:-4] + '.txt'txtfile = os.path.join(txtpath, txtname)tree = ET.parse(in_file)root = tree.getroot()filename = root.find('filename')img = cv2.imdecode(np.fromfile('{}/{}.{}'.format(imgpath, xmlname[:-4], postfix), np.uint8), cv2.IMREAD_COLOR)h, w = img.shape[:2]res = []for obj in root.iter('object'):cls = obj.find('name').textif cls not in classes:classes.append(cls)cls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))bb = convert((w, h), b)res.append(str(cls_id) + " " + " ".join([str(a) for a in bb]))if len(res) != 0:with open(txtfile, 'w+') as f:f.write('\n'.join(res))if __name__ == "__main__":postfix = 'png' # 圖像后綴imgpath = r'E:\A-畢業設計代做數據\helmet\test\images' # 圖像文件路徑xmlpath = r'E:\A-畢業設計代做數據\helmet\test\annotations' # xml文件文件路徑txtpath = r'E:\A-畢業設計代做數據\helmet\test\labels' # 生成的txt文件路徑if not os.path.exists(txtpath):os.makedirs(txtpath, exist_ok=True)list = os.listdir(xmlpath)error_file_list = []for i in range(0, len(list)):try:path = os.path.join(xmlpath, list[i])if ('.xml' in path) or ('.XML' in path):convert_annotation(path, list[i])print(f'file {list[i]} convert success.')else:print(f'file {list[i]} is not xml format.')except Exception as e:print(f'file {list[i]} convert error.')print(f'error message:\n{e}')error_file_list.append(list[i])print(f'this file convert failure\n{error_file_list}')print(f'Dataset Classes:{classes}')
代碼需要修改的地方如下:
1.postfix參數填圖片的后綴,需要注意圖片格式要統一,是png格式就寫png,是jpg格式就寫jpg
2.imgpath參數填圖片所在的路徑
3.xmlpath參數填標注文件的路徑
4.txtpath參數填生成的yolo格式的文件
3.數據集劃分
劃分訓練集和驗證集代碼如下:
import os, shutil
from sklearn.model_selection import train_test_splitval_size = 0.2
#test_size = 0.2
postfix = 'jpg'
imgpath = r'E:\A-畢業設計代做數據\datasets\images'
txtpath = r'E:\A-畢業設計代做數據\datasets\labels'output_train_img_folder =r'E:\A-畢業設計代做數據\datasets\dataset_kengwa/images/train'
output_val_img_folder = r'E:\A-畢業設計代做數據\datasets\dataset_kengwa/images/val'
output_train_txt_folder = r'E:\A-畢業設計代做數據\datasets\dataset_kengwa\labels/train'
output_val_txt_folder = r'E:\A-畢業設計代做數據\datasets\dataset_kengwa\labels/val'os.makedirs(output_train_img_folder, exist_ok=True)
os.makedirs(output_val_img_folder, exist_ok=True)
os.makedirs(output_train_txt_folder, exist_ok=True)
os.makedirs(output_val_txt_folder, exist_ok=True)listdir = [i for i in os.listdir(txtpath) if 'txt' in i]
train, val = train_test_split(listdir, test_size=val_size, shuffle=True, random_state=0)#todo:需要test放開# train, test = train_test_split(listdir, test_size=test_size, shuffle=True, random_state=0)
# train, val = train_test_split(train, test_size=val_size, shuffle=True, random_state=0)for i in train:img_source_path = os.path.join(imgpath, '{}.{}'.format(i[:-4], postfix))txt_source_path = os.path.join(txtpath, i)img_destination_path = os.path.join(output_train_img_folder, '{}.{}'.format(i[:-4], postfix))txt_destination_path = os.path.join(output_train_txt_folder, i)shutil.copy(img_source_path, img_destination_path)shutil.copy(txt_source_path, txt_destination_path)for i in val:img_source_path = os.path.join(imgpath, '{}.{}'.format(i[:-4], postfix))txt_source_path = os.path.join(txtpath, i)img_destination_path = os.path.join(output_val_img_folder, '{}.{}'.format(i[:-4], postfix))txt_destination_path = os.path.join(output_val_txt_folder, i)shutil.copy(img_source_path, img_destination_path)shutil.copy(txt_source_path, txt_destination_path)#
# for i in train:
# shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/images/train/{}.{}'.format(i[:-4], postfix))
# shutil.copy('{}/{}'.format(txtpath, i), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/labels/train/{}'.format(i))
#
# for i in val:
# shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/images/val/{}.{}'.format(i[:-4], postfix))
# shutil.copy('{}/{}'.format(txtpath, i), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/labels/val/{}'.format(i))#todo:需要test則放開# for i in test:
# shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), 'images/test/{}.{}'.format(i[:-4], postfix))
# shutil.copy('{}/{}'.format(txtpath, i), 'labels/test/{}'.format(i))
需要修改的地方如下
下面四個參數只需在自己電腦任意位置新建一個文件夾就行,用于存放生成的訓練集和驗證集,比如新建一個文件夾叫dataset_kengwa,后面的路徑不用動,如下圖左邊的框出來的路徑覆蓋成你的就行
數據集有以下兩種方式放置,都可以進行訓練,常見的數據集放置是第一種,也有開源的數據集按照第二種方式放置的,我都遇見過,也能訓練起來
4.修改yolo的訓練配置文件
我們需要在項目下創建一個data.yaml的文件,文件名根據數據集名稱取,我這里方便演示直接叫data.yaml,如下圖所示
代碼如下:
train: E:\Desktop\new-yolov9\yolotest\images\train # train images (relative to 'path') 4 images
val: E:\Desktop\new-yolov9\yolotest\images\val # val images (relative to 'path') 4 imagesnc: 2# class names
names: ['dog','cat']
三、YOLO環境配置教程
YOLOv11/YOLOv10/YOLOv9/YOLOv8/YOLOv7/YOLOv5 環境都是通用的,只需要安裝一次就行
1.pytorch環境安裝
基礎環境配置參考教程鏈接:環境配置鏈接,如果已經配置好環境可以忽略此步驟
2.其他依賴安裝
安裝requirements.txt文件的環境,需要注釋掉下面兩行,前面的步驟已經安裝了,不注釋的話會覆蓋前面的會安裝最新版本的pytorch,所以注釋掉
沒有這個文件可以自己新建一個requirements.txt,然后把下面代碼復制進去就好了
# Ultralytics requirements
# Example: pip install -r requirements.txt# Base ----------------------------------------
matplotlib>=3.3.0
numpy==1.24.4 # pinned by Snyk to avoid a vulnerability
opencv-python>=4.6.0
pillow>=7.1.2
pyyaml>=5.3.1
requests>=2.23.0
scipy>=1.4.1
tqdm>=4.64.0# Logging -------------------------------------
# tensorboard>=2.13.0
# dvclive>=2.12.0
# clearml
# comet# Plotting ------------------------------------
pandas>=1.1.4
seaborn>=0.11.0# Export --------------------------------------
# coremltools>=7.0 # CoreML export
# onnx>=1.12.0 # ONNX export
# onnxsim>=0.4.1 # ONNX simplifier
# nvidia-pyindex # TensorRT export
# nvidia-tensorrt # TensorRT export
# scikit-learn==0.19.2 # CoreML quantization
# tensorflow>=2.4.1 # TF exports (-cpu, -aarch64, -macos)
# tflite-support
# tensorflowjs>=3.9.0 # TF.js export
# openvino-dev>=2023.0 # OpenVINO export# Extras --------------------------------------
psutil # system utilization
py-cpuinfo # display CPU info
thop>=0.1.1 # FLOPs computation
# ipython # interactive notebook
# albumentations>=1.0.3 # training augmentations
# pycocotools>=2.0.6 # COCO mAP
# roboflow
四、YOLOv11訓練
(1)在根目錄新建一個python文件,取名為:train.py,如果之前看過我的文章,已經新建過就不用重新新建了
(2)把訓練代碼復制到train.py文件,如果之前看過我的文章,已經復制過了就不用重新復制了,只需修改參數就行
訓練的代碼如下:
# -*- coding: utf-8 -*-
"""
@Auth : 掛科邊緣
@File :trian.py
@IDE :PyCharm
@Motto:學習新思想,爭做新青年
@Email :179958974@qq.com
"""
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLOif __name__ == '__main__':model = YOLO(model=r'D:\2-Python\1-YOLO\YOLOv11\ultralytics-8.3.2\ultralytics\cfg\models\11\yolo11.yaml')# model.load('yolo11n.pt') # 加載預訓練權重,改進或者做對比實驗時候不建議打開,因為用預訓練模型整體精度沒有很明顯的提升model.train(data=r'data.yaml',imgsz=640,epochs=50,batch=4,workers=0,device='',optimizer='SGD',close_mosaic=10,resume=False,project='runs/train',name='exp',single_cls=False,cache=False,)
注意注意注意:模型配置路徑改成你自己的路徑,還有數據集配置文件也修改成你自己的路徑
訓練代碼的參數解釋:
- model參數:該參數填入模型配置文件的路徑,改進的話建議不需要填預訓練模型權重
- data參數:該參數可以填入訓練數據集配置文件的路徑
- imgsz參數:該參數代表輸入圖像的尺寸,指定為 640x640 像素
- epochs參數:該參數代表訓練的輪數
- batch參數:該參數代表批處理大小,電腦顯存越大,就設置越大,根據自己電腦性能設置
- workers參數:該參數代表數據加載的工作線程數,出現顯存爆了的話可以設置為0,默認是8
- device參數:該參數代表用哪個顯卡訓練,留空表示自動選擇可用的GPU或CPU
- optimizer參數:該參數代表優化器類型
- close_mosaic參數:該參數代表在多少個 epoch 后關閉 mosaic 數據增強
- resume參數:該參數代表是否從上一次中斷的訓練狀態繼續訓練。設置為False表示從頭開始新的訓練。如果設置為True,則會加載上一次訓練的模型權重和優化器狀態,繼續訓練。這在訓練被中斷或在已有模型的基礎上進行進一步訓練時非常有用。
- project參數:該參數代表項目文件夾,用于保存訓練結果
- name參數:該參數代表命名保存的結果文件夾
- single_cls參數:該參數代表是否將所有類別視為一個類別,設置為False表示保留原有類別
- cache參數:該參數代表是否緩存數據,設置為False表示不緩存。
注意注意注意:一般做科研改進工作時候可以不用預訓練權重,因為用預訓練模型整體精度很難提高
我這里演示加載預訓練權重,訓練輸出如下所示:
五、YOLOv11推理
(1)官網的預訓練模型下載
進入官網的源碼下載地址 :官網模型下載地址,往下面拉,看到模型位置,YOLOv11 針對不同的場景和應用提供了 YOLOv11n、YOLOv11s 等不同大小的模型,具體看官網提供的,需要下載哪個,鼠標左鍵單擊下載就行。
我的源碼包已經下載好了模型了,如果需要其他權重自行下載就行
(2)在根目錄新建一個python文件,取名為:detect.py
(3)把推理代碼復制到detect.py文件
注意注意注意:模型路徑改成你自己的路徑,還有預測圖像也改成你自己的路徑
推理的代碼如下:
# -*- coding: utf-8 -*-
"""
@Auth : 掛科邊緣
@File :detect.py
@IDE :PyCharm
@Motto:學習新思想,爭做新青年
@Email :179958974@qq.com
"""from ultralytics import YOLOif __name__ == '__main__':# Load a modelmodel = YOLO(model=r'D:\2-Python\1-YOLO\YOLOv11\ultralytics-8.3.2\yolo11n-seg.pt') model.predict(source=r'D:\2-Python\1-YOLO\YOLOv11\ultralytics-8.3.2\ultralytics\assets\bus.jpg',save=True,show=True,)
推理代碼的參數解釋
1.model參數:該參數可以填入模型文件路徑
2.source參數:該參數可以填入需要推理的圖片或者視頻路徑,如果打開攝像頭推理則填入0就行
3.save參數:該參數填入True,代表把推理結果保存下來,默認是不保存的,所以一般都填入True
4.show參數:該參數填入True,代表把推理結果以窗口形式顯示出來,默認是顯示的,這個參數根據自己需求打開就行,不顯示你就填False就行
分割模型推理結果如下:
目標檢測模型推理結果如下:
六、解決訓練過程中斷怎么繼續上次訓練
在訓練過程不小心中斷了,那怎么繼續上次的訓練了,這里先不慌,官網也的代碼寫得非常好,它有這個斷點訓練功能,那么 YOLOv8 v10 v11 處理的方法都是一模一樣,接下來直接看圖操作就行:
-
model參數:該參數填入上次中斷的模型,為 last.pt
-
resume參數:該參數設置為True,則會加載上一次訓練的模型權重和優化器狀態,繼續訓練。
總結
YOLOv11訓練自己數據集和推理到此結束,有問題可以留言,創作不易,請幫忙點個愛心唄,謝謝