日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

YOLOv8 从环境搭建到推理训练

發(fā)布時(shí)間:2024/3/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 YOLOv8 从环境搭建到推理训练 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0、引言

硬件配置:使用Mobaxterm_personal_21.4遠(yuǎn)程操控3060服務(wù)器(Linux系統(tǒng)),CUDA版本11.7。

使用anaconda作為python環(huán)境環(huán)境,python為3.8版本。(最好使用3.8版本)

本文最終安裝的pytorch版本是1.13.1,torchvision版本是0.14.1,其他的依賴(lài)庫(kù)按照requirements.txt文件安裝即可。

YOLOv8創(chuàng)新點(diǎn):🍺🍺🍺

1😃Backbone。使用的依舊是CSP的思想,不過(guò)YOLOv5中的C3模塊被替換成了C2f模塊,實(shí)現(xiàn)了進(jìn)一步的輕量化,同時(shí)YOLOv8依舊使用了YOLOv5等架構(gòu)中使用的SPPF模塊;

2😁PAN-FPN。毫無(wú)疑問(wèn)YOLOv8依舊使用了PAN的思想,不過(guò)通過(guò)對(duì)比YOLOv5與YOLOv8的結(jié)構(gòu)圖可以看到,YOLOv8將YOLOv5中PAN-FPN上采樣階段中的卷積結(jié)構(gòu)刪除了,同時(shí)也將C3模塊替換為了C2f模塊

3😑Decoupled-Head。是不是嗅到了不一樣的味道?是的,YOLOv8走向了Decoupled-Head;

4😂Anchor-Free。YOLOv8拋棄了以往的Anchor-Base,使用了Anchor-Free的思想;

5😊損失函數(shù)。YOLOv8使用VFL Loss作為分類(lèi)損失,使用DFL Loss+CIOU Loss作為分類(lèi)損失;

6😚樣本匹配。YOLOv8拋棄了以往的IOU匹配或者單邊比例的分配方式,而是使用了Task-Aligned Assigner匹配方式。

1、代碼下載

代碼連接:

https://github.com/ultralytics/ultralytics

權(quán)重連接:

https://github.com/ultralytics/assets/releases

先睹為快:

下載:點(diǎn)擊右上角的綠色Code按鈕,再點(diǎn)擊Download,即可完成代碼下載。下載之后導(dǎo)入到服務(wù)器端解壓。

解壓之后如下圖所示。

2、環(huán)境準(zhǔn)備

2.1創(chuàng)建新環(huán)境

啟動(dòng)遠(yuǎn)程軟件,進(jìn)入base環(huán)境,創(chuàng)建新環(huán)境yolov8。

conda create -n yolov8 python=3.8

激活新環(huán)境yolov8。

conda activate yolov8

2.2安裝依賴(lài)(各種第三方庫(kù))

運(yùn)行requirements.txt文件即可完成對(duì)所有庫(kù)的安裝,包括pytorch等眾多第三方庫(kù)。

運(yùn)行該文件需要先進(jìn)入到該文件所在的文件夾:cd 各層文件夾。進(jìn)入所在文件夾之后再運(yùn)行該文件。

pip install -r requirements.txt -i https://mirrors.bfsu.edu.cn/pypi/web/simple/

2.3安裝ultralytics

ultralytics集成了yolo的各種包以及模型等,程序中直接調(diào)用。

pip install ultralytics

2.4手動(dòng)下載權(quán)重

雖然在(2)中可以自動(dòng)下載yolov8n.pt,但是經(jīng)常打不開(kāi),所以給出手動(dòng)下載連接。

下載鏈接:https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt

位置:拷到y(tǒng)olov8\ultralytics-main\ultralytics\yolo\v8\detect\yolov8n.pt

3、測(cè)試運(yùn)行

操作:首先進(jìn)入到y(tǒng)olov8\ultralytics-main\ultralytics\yolo\v8\detect\predict.py,運(yùn)行predict.py

python predict.py

完成測(cè)試:

查看結(jié)果:

4、訓(xùn)練自己的數(shù)據(jù)

4.1數(shù)據(jù)準(zhǔn)備

由于本文的實(shí)驗(yàn)是進(jìn)行圖像檢測(cè),故將數(shù)據(jù)集放在detect目錄下。

操作:在detect文件下新建mydata_tuomin文件夾(可自定義),再在mydata_tuomin目錄下新建Annotations, images, ImageSets, labels 四個(gè)文件夾。

📌Annotations目錄下存放圖片的xml文件

📌images目錄下存放數(shù)據(jù)集的圖片文件

📌ImageSets 目錄之后會(huì)在Main文件夾內(nèi)自動(dòng)生成train.txt,val.txt,test.txt和trainval.txt四個(gè)文件

📌labels目錄下存放xml文件轉(zhuǎn)換后的txt標(biāo)準(zhǔn)格式標(biāo)簽

4.2按比例劃分?jǐn)?shù)據(jù)集

操作:在detect目錄下新建一個(gè)文件splitDataset.py,運(yùn)行。

作用:隨機(jī)分配訓(xùn)練/驗(yàn)證/測(cè)試集圖片,會(huì)在ImageSet 目錄下生成四個(gè)txt文件,存放訓(xùn)練集、驗(yàn)證集、測(cè)試集的劃分文件(各集合包含的圖片)。

代碼如下所示:

import os import randomtrainval_percent = 0.9 train_percent = 0.9 xmlfilepath = 'mydata_tuomin/Annotations' txtsavepath = 'mydata_tuomin/ImageSets' total_xml = os.listdir(xmlfilepath)num = len(total_xml) list = range(num) tv = int(num * trainval_percent) tr = int(tv * train_percent) trainval = random.sample(list, tv) train = random.sample(trainval, tr)ftrainval = open('mydata_tuomin/ImageSets/trainval.txt', 'w') ftest = open('mydata_tuomin/ImageSets/test.txt', 'w') ftrain = open('mydata_tuomin/ImageSets/train.txt', 'w') fval = open('mydata_tuomin/ImageSets/val.txt', 'w')for i in list:name = total_xml[i][:-4] + '\n'if i in trainval:ftrainval.write(name)if i in train:ftrain.write(name)else:fval.write(name)else:ftest.write(name)ftrainval.close() ftrain.close() fval.close() ftest.close()

查看結(jié)果:

4.3標(biāo)簽格式轉(zhuǎn)換

由于yolov8使用的labels是txt格式的文件,故需將原始數(shù)據(jù)集xml格式的標(biāo)簽轉(zhuǎn)換為txt格式。

即將每個(gè)xml標(biāo)注提取box信息為txt格式,每個(gè)圖像對(duì)應(yīng)一個(gè)txt文件,文件每一行為一個(gè)目標(biāo)的信息,包括class, x_center, y_center, width, height格式。

操作:在detect目錄下新建一個(gè)文件XML2TXT.py,運(yùn)行。

📌注意代碼第11行,classes = ['…']一定需要填寫(xiě)自己數(shù)據(jù)集的類(lèi)別,在這里我是三個(gè)類(lèi)別'greenplate','blueplate','face'。

📌如果數(shù)據(jù)集中的類(lèi)別不知道或者比較多不想手敲,可以使用4.4中的腳本直接獲取類(lèi)別,如果不需要可以直接跳過(guò)4.4。

結(jié)果:生成的標(biāo)簽存放在labels目錄下,并且在mydata_tuomin目錄下生成三個(gè)txt文件,文件內(nèi)是訓(xùn)練集、驗(yàn)證集、測(cè)試集的圖片路徑。

代碼如下:

# -*- coding: utf-8 -*- # xml解析包 import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import joinsets = ['train', 'test', 'val'] classes = ['greenplate','blueplate','face']# 進(jìn)行歸一化操作 def convert(size, box): # size:(原圖w,原圖h) , box:(xmin,xmax,ymin,ymax)dw = 1./size[0] # 1/wdh = 1./size[1] # 1/hx = (box[0] + box[1])/2.0 # 物體在圖中的中心點(diǎn)x坐標(biāo)y = (box[2] + box[3])/2.0 # 物體在圖中的中心點(diǎn)y坐標(biāo)w = box[1] - box[0] # 物體實(shí)際像素寬度h = box[3] - box[2] # 物體實(shí)際像素高度x = x*dw # 物體中心點(diǎn)x的坐標(biāo)比(相當(dāng)于 x/原圖w)w = w*dw # 物體寬度的寬度比(相當(dāng)于 w/原圖w)y = y*dh # 物體中心點(diǎn)y的坐標(biāo)比(相當(dāng)于 y/原圖h)h = h*dh # 物體寬度的寬度比(相當(dāng)于 h/原圖h)return (x, y, w, h) # 返回 相對(duì)于原圖的物體中心點(diǎn)的x坐標(biāo)比,y坐標(biāo)比,寬度比,高度比,取值范圍[0-1]# year ='2012', 對(duì)應(yīng)圖片的id(文件名) def convert_annotation(image_id):# 對(duì)應(yīng)的通過(guò)year 找到相應(yīng)的文件夾,并且打開(kāi)相應(yīng)image_id的xml文件,其對(duì)應(yīng)bund文件in_file = open('mydata_tuomin/Annotations/%s.xml' % (image_id), encoding='utf-8')# 準(zhǔn)備在對(duì)應(yīng)的image_id 中寫(xiě)入對(duì)應(yīng)的label,分別為# <object-class> <x> <y> <width> <height>out_file = open('mydata_tuomin/labels/%s.txt' % (image_id), 'w', encoding='utf-8')# 解析xml文件tree = ET.parse(in_file)# 獲得對(duì)應(yīng)的鍵值對(duì)root = tree.getroot()# 獲得圖片的尺寸大小size = root.find('size')# 如果xml內(nèi)的標(biāo)記為空,增加判斷條件if size != None:# 獲得寬w = int(size.find('width').text)# 獲得高h(yuǎn) = int(size.find('height').text)# 遍歷目標(biāo)objfor obj in root.iter('object'):# 獲得difficult ??difficult = obj.find('difficult').text# 獲得類(lèi)別 =string 類(lèi)型cls = obj.find('name').text# 如果類(lèi)別不是對(duì)應(yīng)在我們預(yù)定好的class文件中,或difficult==1則跳過(guò)if cls not in classes or int(difficult) == 1:continue# 通過(guò)類(lèi)別名稱(chēng)找到idcls_id = classes.index(cls)# 找到bndbox 對(duì)象xmlbox = obj.find('bndbox')# 獲取對(duì)應(yīng)的bndbox的數(shù)組 = ['xmin','xmax','ymin','ymax']b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))print(image_id, cls, b)# 帶入進(jìn)行歸一化操作# w = 寬, h = 高, b= bndbox的數(shù)組 = ['xmin','xmax','ymin','ymax']bb = convert((w, h), b)# bb 對(duì)應(yīng)的是歸一化后的(x,y,w,h)# 生成 calss x y w h 在label文件中out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')# 返回當(dāng)前工作目錄 wd = getcwd() print(wd)for image_set in sets:# 先找labels文件夾如果不存在則創(chuàng)建if not os.path.exists('mydata_tuomin/labels/'):os.makedirs('mydata_tuomin/labels/')# 讀取在ImageSets/Main 中的train、test..等文件的內(nèi)容# 包含對(duì)應(yīng)的文件名稱(chēng)image_ids = open('mydata_tuomin/ImageSets/%s.txt' % (image_set)).read().strip().split()# 打開(kāi)對(duì)應(yīng)的2012_train.txt 文件對(duì)其進(jìn)行寫(xiě)入準(zhǔn)備list_file = open('mydata_tuomin/%s.txt' % (image_set), 'w')# 將對(duì)應(yīng)的文件_id以及全路徑寫(xiě)進(jìn)去并換行for image_id in image_ids:list_file.write('mydata_tuomin/images/%s.jpg\n' % (image_id))# 調(diào)用 year = 年份 image_id = 對(duì)應(yīng)的文件名_idconvert_annotation(image_id)# 關(guān)閉文件list_file.close()

4.4查看自己的數(shù)據(jù)集標(biāo)簽類(lèi)別

操作:在detect目錄下新建一個(gè)文件ViewCategory.py,運(yùn)行。

代碼如下:(文件路徑也可以使用絕對(duì)路徑)

# coding=gbk import xml.dom.minidom as xmldom import os#voc數(shù)據(jù)集獲取所有標(biāo)簽的所有類(lèi)別數(shù)" annotation_path="/mydata_tuomin/Annotations/"annotation_names=[os.path.join(annotation_path,i) for i in os.listdir(annotation_path)]labels = list() for names in annotation_names:xmlfilepath = namesdomobj = xmldom.parse(xmlfilepath)# 得到元素對(duì)象elementobj = domobj.documentElement#獲得子標(biāo)簽subElementObj = elementobj.getElementsByTagName("object")for s in subElementObj:label=s.getElementsByTagName("name")[0].firstChild.data#print(label)if label not in labels:labels.append(label) print(labels)

4.5創(chuàng)建數(shù)據(jù)加載配置文件

操作:在mydata_tuomin文件夾下新建一個(gè)tuomin.yaml文件(可以自定義命名),用來(lái)存放訓(xùn)練集、驗(yàn)證集、測(cè)試集的路徑文件(train.txt、val.txt、test.txt),以上三個(gè)文件是在步驟4.3中生成的路徑文件(存放在mydata_tuomin目錄下),然后是目標(biāo)的類(lèi)別數(shù)目和具體類(lèi)別列表。

代碼如下:???注意txt需要使用絕對(duì)路徑。

train: /home/xxxxxx/Yolov8/ultralyticsmain/ultralytics/yolo/v8/detect/mydata_tuomin/train.txt val: /home/xxxxxx/Yolov8/ultralyticsmain/ultralytics/yolo/v8/detect/mydata_tuomin/val.txt test: /home/xxxxxx/Yolov8/ultralyticsmain/ultralytics/yolo/v8/detect/mydata_tuomin/test.txt# number of classes nc: 3# class names names: ['greenplate', 'blueplate', 'face']

4.6選擇模型

在ultralytics/models/v8/目錄下是模型的配置文件,提供了n、s、m、l、x版本,逐漸增大(隨著架構(gòu)的增大,訓(xùn)練時(shí)間也是逐漸增大),五種模型對(duì)比圖如下所示。

操作:本文限于硬件配置,采用yolov8s.yaml,接下來(lái)只用修改一個(gè)參數(shù),把nc改成自己的類(lèi)別數(shù)

代碼如下:

# Ultralytics YOLO 馃殌, GPL-3.0 license# Parameters nc: 3 # number of classes(只需要改這里!!!!!!!) depth_multiple: 0.33 # scales module repeats width_multiple: 0.50 # scales convolution channels# YOLOv8.0s backbone backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9# YOLOv8.0s head head:- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 13- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 17 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 12], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 20 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 9], 1, Concat, [1]] # cat head P5- [-1, 3, C2f, [1024]] # 23 (P5/32-large)- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)

4.7開(kāi)始訓(xùn)練

輸入如下命令開(kāi)始訓(xùn)練。

yolo task=detect mode=train model=yolov8s.yaml data=mydata_tuomin/tuomin.yaml epochs=100 batch=4

以上參數(shù)解釋如下:

📌task:選擇任務(wù)類(lèi)型,可選['detect', 'segment', 'classify', 'init']。

📌mode: 選擇是訓(xùn)練、驗(yàn)證還是預(yù)測(cè)的任務(wù)蕾西 可選['train', 'val', 'predict']。

📌model: 選擇yolov8不同的模型配置文件,可選yolov8s.yaml、yolov8m.yaml、yolov8x.yaml等。

📌data: 選擇生成的數(shù)據(jù)集配置文件

📌epochs:指的就是訓(xùn)練過(guò)程中整個(gè)數(shù)據(jù)集將被迭代多少次,顯卡不行你就調(diào)小點(diǎn)。

📌batch:一次看完多少?gòu)垐D片才進(jìn)行權(quán)重更新,梯度下降的mini-batch,顯卡不行你就調(diào)小點(diǎn)。

查看訓(xùn)練過(guò)程:

查看結(jié)果:

總結(jié)

以上是生活随笔為你收集整理的YOLOv8 从环境搭建到推理训练的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。