YOLOV8實戰,從環境配置、數據準備、數據標注、模型訓練、模型導出到源碼分享
- 前言:
- 效果展示
- ==圖片展示==
- ==視頻展示==
- 簡介:
- **【YOLOV8是啥?】**
- **【YOLOV8能干啥?有啥應用場景?】**
- 一、環境準備
- 1、新建一個虛擬環境
- 2、配置第三方庫
- 3、另外我們需要通過克隆倉庫到本地來獲得yolov8最新版本。
- 4、下載一個預訓練模型包
- 5、環境測試
- 測試代碼
- 二、數據集制作
- ①【視頻幀提取代碼】
- ②【圖片標注】
- ③【切分數據集】
- 切分數據集代碼:
- 三、訓練文件配置
- 新建配置文件代碼:
- 四、開始訓練
- 方法一:命令行訓練
- 方法二:代碼訓練
- 五、實時檢測
- 代碼:
- 六、模型推理,pt轉換成onnx模型
- 推理代碼:
- 七、源碼
- 源碼鏈接:
前言:
最近刷到有大佬用目標檢測在做害蟲密度檢測,不明覺厲,心想有時間了我也要去琢磨琢磨物體檢測,前幾天又有人找我幫忙做cf的敵我檢測,這回可是下了決心要磕一磕這個技術了,網上寫YOLOV8的教程不少,但是從數據集制作、標注、訓練、應用的詳細教程往往不在一篇文章中,借鑒起來不是那么方便,所以我把自己摸索路上的一些筆記記錄在這個平臺,一來是備份,方便我將來自己尋找,二來嘛如果將來有人有相同的需求時也能有個參照
效果展示
圖片展示
視頻展示
和平精英敵我檢測
簡介:
【YOLOV8是啥?】
YOLOv8是Ultralytics的最新版本YOLO。作為最先進的 SOTA 模型,YOLOv8 建立在以前版本成功的基礎上,引入了新功能和改進,以增強性能、靈活性和效率。
【YOLOV8能干啥?有啥應用場景?】
有應用場景能幫我們更好的掌握這項技術哦,比如我就是從病蟲害檢測和敵我檢測開始入手學習的。
YOLOv8 支持全方位的視覺 AI 任務,包括檢測、分割、姿勢估計、跟蹤和分類。這種多功能性使用戶能夠在不同的應用程序和域中利用YOLOv8的功能。模型中只需要設定不同的訓練模型,就可以得到不同的檢測結果。
接下來進入教程了
一、環境準備
1、新建一個虛擬環境
在Anaconda Prompt里面輸入以下指令新建環境
conda create --name YOLOV8_1 python=3.9
上面代碼里的–name是新建的環境名稱,指定python版本為3.9,可按需更改
新建完成后,輸入以下代碼進入新建的虛擬環境
activate YOLOV8_1
2、配置第三方庫
在虛擬環境里輸入以下指令下載ultralytic庫和labelimg庫,其中調用YOLOV8在ultralytic庫,數據標注要用到labelimg庫
pip install ultralyticspip install labelimg
3、另外我們需要通過克隆倉庫到本地來獲得yolov8最新版本。
github地址:,鏈接直達
https://github.com/ultralytics/ultralytics
4、下載一個預訓練模型包
github地址:,鏈接直達
https://github.com/ultralytics/assets/releases/tag/v8.2.0
網站上提供了s、m、l、x版本,逐漸增大(隨著架構的增大,訓練時間也是逐漸增大),模型下載好之后和你的代碼放在同級文件夾下
5、環境測試
環境準備到這里就差不多了,接下來執行代碼測試一下環境搭建是否成功
測試代碼
from ultralytics import YOLO
#加載模型,換成你自己的文件位置,圖片也一樣
model = YOLO(r"D:\YOLOV8\ultralytics-main\Self_Code\yolov8n.pt"
source=r"C:\Users\user2580185125\Desktop\yolov8博客\測試環境.png"
#進行預測并保存
model.predict(source, save=True, imgsz=640, conf=0.7)
測試效果展示
【原圖】
【效果圖】
這就代表你的環境搭建好了,我們要進入下一步驟了
二、數據集制作
我們測試的圖片數據來自游戲視頻,當然如果你有自己的圖片素材也可,爬蟲也可,我先錄屏自己玩游戲,之后用代碼把視頻幀提取出來作為我們的原始圖片,在這個上面去標注
①【視頻幀提取代碼】
import os
import cv2
import sys
import time
#遍歷指定目錄下所有的視頻,按照指定時間間隔截取視頻幀
def save_frame(time_in_sec, file_path):# 打開視頻文件cap = cv2.VideoCapture(file_path)# 獲取視頻的幀率fps = cap.get(cv2.CAP_PROP_FPS)# 獲取視頻的總幀數total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))duration = total_frames / fpsnum = 0while(num < duration):num = num + time_in_sec# 計算指定時間對應的幀數frame_number = int(num * fps)# 設置視頻的當前幀cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)# 讀取當前幀ret, frame = cap.read()if ret:timestamp = int(time.time()) # 獲取當前時間戳save_path = f"image\\frame_{frame_number}_{timestamp}.jpg"# 保存當前幀為圖片cv2.imwrite(save_path, frame)print("保存成功:" + save_path)else:print("讀取視頻幀失敗")# 關閉視頻文件cap.release()def traverse_directory(directory):for root, dirs, files in os.walk(directory):for file in files:video_path = os.path.join(root, file)print(video_path)save_frame(2, video_path)
if __name__ == '__main__':# 遍歷當前目錄,這個換成自己的traverse_directory(r'D:\YOLOV8\ultralytics-main\Self_Code\視頻逐幀轉為圖片\video')print("運行成功")
代碼的同級文件夾下要新建一個image文件夾,用來存放圖片的,我沒寫判斷語句,沒有的話會報錯
②【圖片標注】
有了圖片我們就可以開始標注了,先激活虛擬環境,在虛擬環境中執行以下代碼打開標注軟件
labelimg
軟件打開之后是這樣的
在軟件左側選擇你需要打標簽的文件夾,記得文件格式選擇yolo格式,注意看圖片,都圈出來了,之后就可以盡情的標注了,標注好了一張圖片就保存一張,這一步比較費眼睛
③【切分數據集】
標注好的數據集需要切分為訓練、測試、驗證數據集,執行以下代碼進行一鍵切分,代碼中需要修改原數據集存放位置和保存位置,另外就是原圖片得放在一個images文件夾里面,不然會報錯
切分數據集代碼:
import os
import random
import shutil# 原數據集目錄
root_dir = r'D:\YOLOV8\ultralytics-main\Self_Code\視頻逐幀轉為圖片'
# 劃分比例
train_ratio = 0.8
valid_ratio = 0.1
test_ratio = 0.1# 設置隨機種子
random.seed(42)# 拆分后數據集目錄
split_dir = r'D:\YOLOV8\ultralytics-main\Self_Code\self_img'
os.makedirs(os.path.join(split_dir, 'train/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'train/labels'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'valid/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'valid/labels'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'test/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'test/labels'), exist_ok=True)# 獲取圖片文件列表
image_files = os.listdir(os.path.join(root_dir, 'images'))
image_files = [file for file in image_files if file[-3:] != 'txt']# 隨機打亂文件列表
# combined_files = list(zip(image_files, label_files))
combined_files = list(image_files)
random.shuffle(combined_files)
# image_files_shuffled, label_files_shuffled = zip(*combined_files)
image_files_shuffled = combined_files
# 根據比例計算劃分的邊界索引
train_bound = int(train_ratio * len(image_files_shuffled))
valid_bound = int((train_ratio + valid_ratio) * len(image_files_shuffled))# 將圖片和標簽文件移動到相應的目錄for i, image_file in enumerate(image_files_shuffled):label_file = f"{image_file.split('.')[0]}.txt"# 復制文件劃分數據集,可以將圖片和標簽放在同一個文件夾下if i < train_bound:shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'train/images', image_file))shutil.copy(os.path.join(root_dir, 'images', label_file), os.path.join(split_dir, 'train/labels', label_file))elif i < valid_bound:shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'valid/images', image_file))shutil.copy(os.path.join(root_dir, 'images', label_file), os.path.join(split_dir, 'valid/labels', label_file))else:shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'test/images', image_file))shutil.copy(os.path.join(root_dir, 'images', label_file), os.path.join(split_dir, 'test/labels', label_file))print('執行完成')
切分好的文件夾層級是這樣的
圖片
標簽
三、訓練文件配置
新建一個yaml配置文件,放在訓練代碼的同級文件夾下,我這里隨便取個名字叫cat.yaml,修改里面的文件存放地址,改成你自己的文件地址,names那里你有幾個類就寫幾個類,往下加或者減,按照格式來就行
新建配置文件代碼:
# 和平精英
train: D:\YOLOV8\ultralytics-main\Self_Code\self_img\train
val: D:\YOLOV8\ultralytics-main\Self_Code\self_img\valid
test: D:\YOLOV8\ultralytics-main\Self_Code\self_img\test# Classes
names:0: enemy1: self2: team3: jilifu
另外還需要去修改你預訓練模型的配置文件,這個文件是你在github那里下載下來的,圖片里圈的很詳細怎么找,我用的是yolov,就要去D:\YOLOV8\ultralytics-main\ultralytics\cfg\models\v8文件夾修改yolov8.yaml文件夾,主要是改nc,你有幾個類別就改成幾我復制了一份文件,改的復制文件的內容,這樣下次還能找著源文件
好,準備工作結束,即將開始訓練
四、開始訓練
訓練有兩種方式,一種是命令行訓練,一種是代碼訓練,我個人更傾向代碼訓練,這樣方便我找訓練好的權重文件,這里兩種方式都給出了
方法一:命令行訓練
yolo task=detect mode=train model=yolov8n.yaml data=cat.yaml epochs=300 batch=1
以上參數解釋如下:
-
task:選擇任務類型,可選[‘detect’, ‘segment’, ‘classify’, ‘init’]
-
mode: 選擇是訓練、驗證還是預測的任務蕾西 可選[‘train’, ‘val’, ‘predict’]
-
model:
選擇yolov8不同的模型配置文件,可選yolov8s.yaml、yolov8m.yaml、yolov8l.yaml、yolov8x.yaml -
data: 選擇生成的數據集配置文件
-
epochs:指的就是訓練過程中整個數據集將被迭代多少次,顯卡不行你就調小點。
-
batch:一次看完多少張圖片才進行權重更新,梯度下降的mini-batch,顯卡不行你就調小點
方法二:代碼訓練
from ultralytics import YOLOif __name__ == '__main__':model = YOLO(r'D:\YOLOV8\ultralytics-main\ultralytics\cfg\models\v8\yolov8_test.yaml')model.train(model=r'D:\YOLOV8\ultralytics-main\Self_Code\yolov8n.pt',data=r'D:\YOLOV8\ultralytics-main\Self_Code\cat.yaml', epochs=300 , imgsz=640, batch=1, workers=0,pretrained=False, save_dir=r"D:\YOLOV8\ultralytics-main\Self_Code")
是不是很簡單
訓練開始了
靜靜等待訓練結束,看看損失函數
因為我這訓練集只有58張圖片,訓練了300個epoch,明顯是不夠的,檢測自己是大概率能檢測出來,敵人和隊友目前檢測效果不是很好
五、實時檢測
代碼:
import cv2
from ultralytics import YOLO# 加載YOLOv8模型
model = YOLO(r'D:\YOLOV8\ultralytics-main\Self_Code\runs\detect\train5\weights\best.pt')# 打開視頻文件
video_path = r"C:\Users\user2580185125\Desktop\5月11日.mp4"
cap = cv2.VideoCapture(video_path)# 循環遍歷視頻幀
while cap.isOpened():# 從視頻讀取一幀success, frame = cap.read()if success:# 在幀上運行YOLOv8追蹤,持續追蹤幀間的物體results = model.track(frame, persist=True)# 輸出每次追蹤推理結果的boxes,這些參數實際上是和模型直接predict類似的。print(results[0].boxes)# 在幀上展示結果annotated_frame = results[0].plot()# 展示帶注釋的幀cv2.imshow("YOLOv8 Tracking", annotated_frame)# 如果按下'q'則退出循環if cv2.waitKey(1) & 0xFF == ord("q"):breakelse:# 如果視頻結束則退出循環break# 釋放視頻捕獲對象并關閉顯示窗口
cap.release()
cv2.destroyAllWindows()
接下來把我們訓練好的模型拿來跑一跑實時檢測,發現欠缺的地方還蠻多的,如果擴充訓練集和epoch,模型效果應該會更好
六、模型推理,pt轉換成onnx模型
ONNX的主要優勢包括:
-
框架無關性:ONNX允許開發者在PyTorch、TensorFlow、Caffe2等多個流行框架之間自由轉換模型。
-
優化和加速:ONNX提供了一套優化工具,可以減少模型的大小并提高執行效率,特別是在不同硬件上部署時。
-
廣泛的支持:從云計算服務到邊緣設備,ONNX都能提供良好的支持,使得模型部署變得更加靈活和廣泛。
推理代碼:
from ultralytics import YOLO
model = YOLO(r"D:\YOLOV8\ultralytics-main\Self_Code\runs\detect\train\weights\best.pt")
success = model.export(format="onnx", simplify=True) # export the model to onnx format
assert success
print("轉換成功")
七、源碼
源碼全部公開,感興趣的朋友可以繼續開發
源碼鏈接:
百度云盤鏈接
鏈接:https://pan.baidu.com/s/1Ci5Fpx4iBXRphQhhyR4Sig
提取碼:dp18