YOLOV8實戰-和平精英敵我檢測

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

git

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

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

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

相關文章

多讀書,多鍛煉,勇敢點,去面對,去解決

這些建議都是非常積極和有益的&#xff0c;它們涵蓋了身心健康和個人成長的重要方面。以下是對這些建議的詳細解釋&#xff1a; 多讀書&#xff1a; 拓寬視野&#xff1a;書籍是知識的海洋&#xff0c;通過閱讀&#xff0c;我們可以接觸到各種各樣的思想、文化和經驗&#xff0…

“webpack-dev-server --config build/webpack.dev.conf.js” 請問這個問題要如何修復

解決方案 修改部署方式&#xff1a; 使用 webpack 來打包你的項目&#xff0c;生成靜態文件。在生產環境中&#xff0c;使用 Nginx 或其他 HTTP 服務器來提供服務&#xff0c;而不是使用 webpack-dev-server。 Dockerfile 調整&#xff1a; 確保 Dockerfile 中使用的命令是用于…

ArcGIS Maps :在Vue3中加載ArcGIS地圖

Vue3中使用ArcGIS Maps SDK for JavaScript的步驟 一、創建 Vue 3 項目 1、新建ArcGISAPIProject文件夾&#xff0c;并用vscode打開 2、打開終端&#xff0c;在終端中輸入npm create vitelatest項目名稱vite-vue3-arcgis,選擇vue框架&#xff0c;并選中JavaScript語音創建項目…

Linux中的網絡隔離功能 netns

Network Namespace&#xff08;netns&#xff09; 是Linux內核提供的一項實現網絡隔離的功能&#xff0c;它能隔離多個不同的網絡空間&#xff0c;并且各自擁有獨立的網絡協議棧。通過 namespace 可以隔離容器的進程 PID、文件系統掛載點、主機名等多種資源&#xff0c;它可以為…

水利行業工程設計資質標準

甲級資質&#xff1a; 具有獨立企業法人資格。社會信譽良好&#xff0c;注冊資本不少于600萬元人民幣。企業完成過的工程設計項目應滿足所申請行業主要專業技術人員配備表中對工程設計類型業績考核的要求&#xff0c;且要求考核業績的每個設計類型的大型項目工程設計不少于1項…

vscode調試Electron+ts

調試Electronjs 調試Electronjs: https://www.electronjs.org/zh/docs/latest/tutorial/debugging-vscode 調試Electronts 首先看一下&#xff0c;我的目錄結構。目錄結構決定了launch.json中的路徑部分。我將在項目根目錄下進行調試&#xff0c;項目根目錄下包含electron代碼…

探索QChart:Qt中的數據可視化藝術

目錄標題 1. QChart概述2. 創建QChart對象3. 添加數據系列&#xff08;Series&#xff09;4. 定制圖表外觀5. 交互與動畫6. 圖表布局與管理7. 實例代碼與解析8. 總結 在數字化的世界里&#xff0c;數據是新的石油。然而&#xff0c;原始數據本身往往難以理解&#xff0c;數據可…

數據可視化(十一):Pandas餐飲信息表分析——交叉表、離群點分析,多維分析等高級操作

Tips&#xff1a;"分享是快樂的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不僅有知識的海洋&#x1f30a;&#xff0c;還有滿滿的正能量加持&#x1f4aa;&#xff0c;快來和我一起分享這份快樂吧&#x1f60a;&#xff01; 喜歡我的博客的話&#xff0c;記得…

golang創建式設計模式------單例模式

目錄導航 1.單例模式1)什么是單例模式 2)使用場景3)實現方式1.懶漢式單例模式2.餓漢式3.雙重檢查式4.sysc.Once式 4)實踐案例5)優缺點分析 1.單例模式 1)什么是單例模式 單例模式(Singleton Pattern)是一種常用的設計模式。單例模式的類提供了一種訪問其唯一對象的方法&#…

RAG系列論文

檢索增強模型&#xff1a; 提出Atlas &#xff1a;預訓練檢索增強模型 Few-shot Learning with Retrieval Augmented Language Models 鏈接 根據輸入問題的不同&#xff0c;挑選合適的提示詞 Learning To Retrieve Prompts for In-Context Learning 鏈接 RAG&#xff1a; M…

【數據結構】線性表--順序表(二)

文章目錄 1、什么是線性表2、線性表的基本操作3、順序表3.1、順序表的定義3.2、順序表的實現方式&#xff1a;靜態分配3.3、順序表的實現方式&#xff1a;動態分配3.4、順序表的特點3.5、順序表的初始化與插入操作3.6、順序表的刪除與查詢 1、什么是線性表 ? 線性表是具有相同…

【Python快速上手(二十二)】

目錄 Python快速上手&#xff08;二十二&#xff09;Python3 使用數據庫-pymysql1. 創建數據庫連接2. 創建數據表3. 插入數據4. 查詢數據5. 使用 WHERE 條件語句6. 排序7. 刪除記錄8. 更新表數據9. 刪除表10.異常處理總結 Python快速上手&#xff08;二十二&#xff09; Pytho…

通過EXCEL控制PLC啟停電機的一種方法

概述 本例將介紹用微軟EXCEL電子表格控制西門子S7-1200 PLC實現電機啟停的一種方法。 第1步&#xff1a; 添加PLC設備&#xff0c;選擇西門子S7-1214C CPU&#xff0c;設置IP地址&#xff1a;192.168.18.18&#xff0c;子網掩碼&#xff1a;255.255.255.0。 第2步&#xff1a…

vue3中通過自定義指令實現loading加載效果

前言 在現代Web開發中&#xff0c;提升用戶體驗一直是開發者們追求的目標之一。其中&#xff0c;一個常見的場景就是在用戶與應用程序進行交互時&#xff0c;特別是當進行異步操作時&#xff08;如網絡請求&#xff09;&#xff0c;為用戶提供即時的反饋&#xff0c;避免用戶因…

Flet初體驗:Python跨平臺開發新選擇

文章目錄 ?? 介紹 ???? 演示環境 ???? 初識Flet ???? 安裝與配置?? 構建第一個Flet應用?? Flet打包:跨平臺的魔法?? Flet與FastAPI的結合?? 總結?? 相關鏈接 ???? 介紹 ?? “探索未知,擁抱創新,Flet讓我在應用開發的世界中找到了新的航標。”…

02 | 該如何選擇消息隊列?

RabbitMQ RabbitMQ 一個比較有特色的功能是支持非常靈活的路由配置&#xff0c;和其他消息隊列不同的是&#xff0c;它在生產者&#xff08;Producer&#xff09;和隊列&#xff08;Queue&#xff09;之間增加了一個 Exchange 模塊&#xff0c;你可以理解為交換機。 問題 Ra…

【循環程序設計-譚浩強適配】(適合專升本、考研)

無償分享學習資料&#xff0c;需要的小伙伴評論區或私信dd。。。 無償分享學習資料&#xff0c;需要的小伙伴評論區或私信dd。。。 無償分享學習資料&#xff0c;需要的小伙伴評論區或私信dd。。。 完整資料如下&#xff1a;純干貨、純干貨、純干貨&#xff01;&#xff01;…

淺談電動汽車充電站的電氣安全

1 引言 1月14日日上午10點左右&#xff0c;青島市市北區遼寧路63號公交停車場內&#xff0c;一輛報廢公交車突然起火&#xff0c;由于大風天氣&#xff0c;大火很快引燃了停在旁邊的幾輛報廢車。消防人員快速趕到&#xff0c;迅速控制住火勢。11時30分&#xff0c;停車場內的…

鴻蒙內核源碼分析(ELF格式篇) | 應用程序入口并不是main

閱讀之前的說明 先說明&#xff0c;本篇很長&#xff0c;也很枯燥&#xff0c;若不是絕對的技術偏執狂是看不下去的.將通過一段簡單代碼去跟蹤編譯成ELF格式后的內容.看看ELF究竟長了怎樣的一副花花腸子&#xff0c;用readelf命令去窺視ELF的全貌&#xff0c;最后用objdump命令…

Image to Music V2 :只需上傳一張照片,自動轉換成與圖片內容匹配的音頻!

前言 我們之前肯定已經見過了很多文本生成圖片、文本生成聲音以及AI翻唱歌曲 等多種AI產品&#xff08;模型&#xff09;。 其實音樂和圖片從某種意義上來說都是藝術創作的一種形式&#xff0c;它們可以相互配合&#xff0c;共同呈現出一種更加豐富、感性的表達方式。 將圖片…