【非機動車檢測】用YOLOv8實現非機動車及駕駛人佩戴安全帽檢測

非機動車駕駛人佩戴安全帽檢測任務的意義主要包括以下幾點:

  1. 保障行車安全:非機動車包括自行車、電動車等,佩戴安全帽能夠有效保護騎車人頭部,減少因交通事故造成的頭部傷害風險,提高行車安全系數。

  2. 符合交通法規:許多國家和地區的交通法規要求騎車人員在騎行時佩戴安全帽,因此進行安全帽檢測任務可以確保遵守相關法規,避免因未佩戴安全帽而受到處罰。

  3. 促進交通安全宣傳:通過開展安全帽檢測任務,可以增強公眾對交通安全的認識和重視程度,提升騎車人員自我保護意識,倡導大眾積極參與交通安全宣傳活動。

  4. 減少交通事故傷亡:頭部是人體最脆弱的部位之一,遭受外傷后很容易導致嚴重后果。通過佩戴安全帽,可以有效降低頭部受傷的風險,減少交通事故造成的傷亡人數。

????????非機動車及駕駛人佩戴安全帽檢測任務的意義在于提高行車安全性、符合法規要求、促進交通安全宣傳和減少交通事故傷亡。

????????本文以YOLOv8為基礎(可以換成YOLOv11/YOLOv12),設計研究了基于YOLOv8的非機動車及駕駛人是否佩戴安全帽檢測識別任務,包含完整數據介紹、訓練過程和測試結果全流程。

若需要完整數據集和源代碼可以私信。

目錄

🌷🌷1.數據集介紹

👍👍2.識別檢測實現效果

🍎🍎3.YOLOv8識別非機動車及安全帽算法步驟

🍋3.1數據準備

🍋3.2模型選擇

🍋3.3加載預訓練模型

🍋3.4輸入數據組織

🍭🍭4.目標檢測訓練代碼

🏆🏆5.目標檢測推理代碼

整理不易,歡迎一鍵三連!!!送你們一條美麗的--分割線--


🌷🌷1.數據集介紹

? ? ? ? 非機動車及駕駛人是否佩戴安全帽數據集為攝像頭視角拍攝到的實際影像,主要包含4類數據:

0:安全帽1:?駕駛人未戴安全帽2:駕駛人戴安全帽3:非機動車

????????部分影像展示如下:

?label為txt格式的yolo目標檢測格式,示例txt文件內容為:

訓練驗證比例可以自行調整,這里不贅述。

👍👍2.識別檢測實現效果

🍎🍎3.YOLOv8識別非機動車及安全帽算法步驟

????????通過目標檢測方法進行非機動車及安全帽識別的方法不限,本文以YOLOv8為例進行說明。

🍋3.1數據準備

數據組織:

----非機動車_dataset
? ? ? ?----images
? ? ? ? ? ? ? ? ----train
? ? ? ? ? ? ? ? ----val
? ? ? ? ----labels
? ? ? ? ? ? ? ? ----train
? ? ? ? ? ? ? ? ----val

?image/train文件夾下內容如下:

????????labels/train文件夾下內容如下:

模型訓練label部分采用的是YOLO格式的txt文件,所以如果自己的數據集是xml格式或者json格式需要進行轉換哦,轉換可移步這里。

? ? ? ? 具體txt格式內容如1.數據集介紹中所示。

🍋3.2模型選擇

? ? ? ? 以YOLOv8為例,模型選擇代碼如下:

from ultralytics import YOLO# Load a model
model = YOLO('yolov8n.yaml') ?# build a new model from YAML
model = YOLO('yolov8n.pt') ?# load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt') ?# build from YAML and transfer weights

? ? ? ? 其中yolov8n.yaml為./ultralytics/cfg/models/v8yolov8n.yaml,可根據自己的數據進行模型調整,打開yolov8n.yaml顯示內容如下:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 4 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPss: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n 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.0n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 12- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 15 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 12], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 18 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 9], 1, Concat, [1]] # cat head P5- [-1, 3, C2f, [1024]] # 21 (P5/32-large)- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)

打印的網絡結構如下:

from  n    params  module                                       arguments                     0                  -1  1       464  ultralytics.nn.modules.conv.Conv             [3, 16, 3, 2]                 1                  -1  1      4672  ultralytics.nn.modules.conv.Conv             [16, 32, 3, 2]                2                  -1  1      7360  ultralytics.nn.modules.block.C2f             [32, 32, 1, True]             3                  -1  1     18560  ultralytics.nn.modules.conv.Conv             [32, 64, 3, 2]                4                  -1  2     49664  ultralytics.nn.modules.block.C2f             [64, 64, 2, True]             5                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]               6                  -1  2    197632  ultralytics.nn.modules.block.C2f             [128, 128, 2, True]           7                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]              8                  -1  1    460288  ultralytics.nn.modules.block.C2f             [256, 256, 1, True]           9                  -1  1    164608  ultralytics.nn.modules.block.SPPF            [256, 256, 5]                 10                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          11             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           12                  -1  1    148224  ultralytics.nn.modules.block.C2f             [384, 128, 1]                 13                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          14             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           15                  -1  1     37248  ultralytics.nn.modules.block.C2f             [192, 64, 1]                  16                  -1  1     36992  ultralytics.nn.modules.conv.Conv             [64, 64, 3, 2]                17            [-1, 12]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           18                  -1  1    123648  ultralytics.nn.modules.block.C2f             [192, 128, 1]                 19                  -1  1    147712  ultralytics.nn.modules.conv.Conv             [128, 128, 3, 2]              20             [-1, 9]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           21                  -1  1    493056  ultralytics.nn.modules.block.C2f             [384, 256, 1]                 22        [15, 18, 21]  1    752092  ultralytics.nn.modules.head.Detect           [4, [64, 128, 256]]           
YOLOv8n summary: 225 layers, 3011628 parameters, 3011612 gradients, 8.2 GFLOPs

? ? ? ? 主要需要修改的地方為nc,也就是num_class,此處數據集類別為4類,所以nc=4。

? ? ? ? 如果其他的模型參數不變的話,就默認保持原版yolov12,需要改造模型結構的大佬請繞行。

🍋3.3加載預訓練模型

? ? ? ? 加載預訓練模型yolov8n.pt,可以在第一次運行時自動下載,如果受到下載速度限制,也可以自行下載好(下載鏈接),放在對應目錄下即可。

🍋3.4輸入數據組織

? ? ? ? yolov8還是以yolo格式的數據為例,./ultralytics/cfg/datasets/data.yaml的內容示例如下:

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco8 ?# dataset root dir
train: images/train ?# train images (relative to 'path') 4 images
val: images/val ?# val images (relative to 'path') 4 images
test: ?# test images (optional)# Classes (80 COCO classes)
names:0: person1: bicycle2: car# ...77: teddy bear78: hair drier79: toothbrush

? ? ? ? 這個是官方的標準coco數據集,需要換成自己的數據集格式,此處建議根據自己的數據集設置新建一個feijidongche_detect_coco128.yaml文件,放在./ultralytics/cfg/datasets/目錄下,最后數據集設置就可以直接用自己的feijidongche_detect_coco128.yaml文件了。以我的feijidongche_detect_coco128.yaml文件為例:

path: /home/datasets/feijidongche# dataset root dir
train: images/train ?# train images (relative to 'path') 4 images
val: images/val ?# val images (relative to 'path') 4 images
test: images/test # test images (optional)names:0: helmet      1: per-no-hel 2: per-w-hel 3:Non-motorized-vehicle


🍭🍭4.目標檢測訓練代碼

準備好數據和模型之后,就可以開始訓練了,train.py的內容顯示為:

from ultralytics import YOLO# Load a model
#model = YOLO('yolov12n.yaml') ?# build a new model from YAML
#model = YOLO('yolov12n.pt') ?# load a pretrained model (recommended for training)
model = YOLO('yolov12n.yaml').load('yolov12n.pt') ?# build from YAML and transfer weights# Train the model
results = model.train(data='yinliao_detect_coco128.yaml', epochs=200, imgsz=640)

? ? ? ? 通常我會選擇在基礎YOLO模型上進行transfer微調,不會從頭開始訓練,如果想自己從頭開始,可以自行選擇第一種方式。這里建議選擇第三種。

?4.1訓練過程

? ? ? ? 開始訓練之后就會開始打印log文件了。如下圖所示:
?

?訓練完成后會在/run/detect/目錄下生成train或者train+數字的文件夾,存放你的訓練結果。

訓練完成后的結果如下:

????????其中weights文件夾內會包含2個模型,一個best.pth,一個last.pth。

????????至此就可以使用best.pth進行推理檢測非機動車及佩戴安全帽了。

訓練精度展示:

?

可視化效果:

🏆🏆5.目標檢測推理代碼

批量推理python代碼如下:

from ultralytics import YOLO
from PIL import Image
import cv2
import osmodel = YOLO('/yolov8/runs/detect/train/weights/best.pt') ?# load a custom model
path = '/home/dataset/feijidongche/images/test/' ?#test_image_path_dir
img_list = os.listdir(path)
for img_path in img_list:
### ?=============detect=====================im1 = Image.open(os.path.join(path,img_path))results = model.predict(source=im1, save=True,save_txt=True)

若需要完整數據集和源代碼可以私信。

整理不易,歡迎一鍵三連!!!
送你們一條美麗的--分割線--


🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸????🍎🍎👍👍🌷🌷

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

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

相關文章

壹起航:15年深耕互聯網營銷,助力中國工廠出海獲客

在全球化浪潮下,越來越多的中國工廠渴望拓展海外市場,但面臨品牌建立、穩定詢盤獲取及營銷成本降低等多重挑戰。壹起航憑借15年的豐富經驗,整合外貿建站、SEO優化及海外短視頻營銷,為中國工廠提供一站式出海解決方案。 一、外貿獨…

Emacs 折騰日記(二十)——修改emacs的一些默認行為

上一篇我們完成了emacs輸入法的配置以及將emacs配置成了使用vim的操作方式。但是emacs目前有些默認行為我不太喜歡,這節我們一起來修改它 備份設置 我們打開emacs的配置文件所在路徑,發現有大量的~結尾的文件,這是emacs的備份文件。這里&am…

聊透多線程編程-線程基礎-4.C# Thread 子線程執行完成后通知主線程執行特定動作

在多線程編程中,線程之間的同步和通信是一個常見的需求。例如,我們可能需要一個子線程完成某些任務后通知主線程,并由主線程執行特定的動作。本文將基于一個示例程序,詳細講解如何使用 AutoResetEvent 來實現這種場景。 示例代碼…

【網絡安全 | 項目開發】Web 安全響應頭掃描器(提升網站安全性)

原創項目,未經許可,不得轉載。 文章目錄 項目簡介工作流程示例輸出技術棧項目代碼使用說明項目簡介 安全響應頭是防止常見 Web 攻擊(如點擊劫持、跨站腳本攻擊等)的有效防線,因此合理的配置這些頭部信息對任何網站的安全至關重要。 Web 安全響應頭掃描器(Security Head…

使用libcurl編寫爬蟲程序指南

用戶想知道用Curl庫編寫的爬蟲程序是什么樣的。首先,我需要明確Curl本身是一個命令行工具和庫,用于傳輸數據,支持多種協議。而用戶提到的“Curl庫”可能指的是libcurl,這是一個客戶端URL傳輸庫,可以用在C、C等編程語言…

使用pip3安裝PyTorch與PyG,實現NVIDIA CUDA GPU加速

使用python3的pip3命令安裝python依賴庫。 # python3 -V Python 3.12.3 # # pip3 -V pip 25.0.1 from /root/.pyenv/versions/3.12.3/lib/python3.12/site-packages/pip (python 3.12)Usage: pip3 install [options] <package> ...pip3 install [options] -r <re…

五種常用的web加密算法

文章目錄 五種常用Web加密算法實戰及原理詳解1. AES (高級加密標準)原理詳解應用場景實戰代碼&#xff08;Node.js&#xff09; 2. RSA (非對稱加密)原理詳解應用場景實戰代碼&#xff08;Node.js&#xff09; 3. SHA-256 (安全哈希算法)原理詳解應用場景實戰代碼&#xff08;瀏…

深入解析 C++ 設計模式:原理、實現與應用

一、引言 在 C 編程的廣袤領域中&#xff0c;設計模式猶如閃耀的燈塔&#xff0c;為開發者指引著構建高效、可維護軟件系統的方向。設計模式并非神秘莫測的代碼魔法&#xff0c;實際上&#xff0c;我們在日常編程中或許早已與之打過交道。簡單來說&#xff0c;設計模式常常借助…

Python刷題筆記

Python刷題筆記 1、輸出格式化 第一種格式化的輸出&#xff1a; name "jack" age 17 salary 20031.8752 print("你的名字是&#xff1a;%s,今年 %d 歲,工資 %7.2f" % (name,age,salary) ) --------------------------------------- 你的名字是&#…

【Kubernetes】Kubernetes 如何進行日志管理?Fluentd / Loki / ELK 適用于什么場景?

由于 Kubernetes 運行在容器化的環境中&#xff0c;應用程序和系統日志通常分布在多個容器和節點上&#xff0c;傳統的日志管理方法&#xff08;例如直接訪問每個節點的日志文件&#xff09;在 Kubernetes 中不適用。 因此&#xff0c;Kubernetes 引入了集中式日志管理方案&am…

Ansible(8)——循環與條件任務

目錄 一、循環迭代任務&#xff1a; 1、簡單循環&#xff1a; 2、循環字典列表&#xff1a; 3、Ansible 2.5 之前的循環關鍵字&#xff1a; 4、在循環中使用 register 變量&#xff1a; 二、條件任務&#xff1a; 1、使用條件句的常見場景&#xff1a; 2、條件任務語法…

adb|scrcpy的安裝和配置方法|手機投屏電腦|手機聲音投電腦|adb連接模擬器或手機

adb|scrcpy的安裝和配置方法手機投屏電腦|手機聲音投電腦|adb連接模擬器或手機或電視 引言 在數字設備交織的現代生活中&#xff0c;adb&#xff08;Android Debug Bridge&#xff09;與 scrcpy 宛如隱匿的強大工具&#xff0c;極大地拓展了我們操控手機、模擬器乃至智能電視等…

vue3項目集成electron

一、環境準備 1. 確保已安裝 Node.js (建議版本 16.x 或更高) 2. 創建或進入現有 Vue 項目目錄 cd your-vue-project 二、添加 Electron 支持 在項目根目錄執行: vue add electron-builder 執行后會在 `src` 目錄下生成 `background.js` 主進程文件。 三、主進程配置 (ba…

循環神經網絡 - 參數學習之隨時間反向傳播算法

本文中&#xff0c;我們以同步的序列到序列模式為例來介紹循環神經網絡的參數學習。 循環神經網絡中存在一個遞歸調用的函數 &#x1d453;(?)&#xff0c;因此其計算參數梯度的方式和前饋神經網絡不太相同。在循環神經網絡中主要有兩種計算梯度的方式&#xff1a;隨時間反向…

體驗OceanBase的 并行導入功能

在數據庫的日常使用中&#xff0c;會經常遇到以下場景&#xff1a; ?數據復制?&#xff1a;將一個或多個表中的數據復制到目標表中&#xff0c;可能是復制全部數據&#xff0c;也可能僅復制部分數據。數據合并&#xff1a;將數據從一個表轉移到另一個表&#xff0c;或者將多…

Kafka和RocketMQ相比有什么區別?那個更好用?

Kafka和RocketMQ相比有什么區別?那個更好用? Kafka 和 RocketMQ 都是廣泛使用的消息隊列系統&#xff0c;它們有很多相似之處&#xff0c;但也有一些關鍵的區別。具體選擇哪個更好用&#xff0c;要根據你的應用場景和需求來決定。以下是它們之間的主要區別&#xff1a; 1. …

UniApp 實現兼容 H5 和小程序的拖拽排序組件

如何使用 UniApp 實現一個兼容 H5 和小程序的 九宮格拖拽排序組件&#xff0c;實現思路和關鍵步驟。 一、實現目標 支持拖動菜單項改變順序拖拽過程實時預覽移動位置拖拽松開后自動吸附回網格兼容 H5 和小程序平臺 二、功能結構拆解以及完整代碼 完整代碼&#xff1a; <…

[raspberrypi 0w and respeaker 2mic]實時音頻波形

0. 環境 ubuntu22主機&#xff0c; 192.168.8.162&#xff0c; raspberry 0w&#xff0c; 192.168.8.220 路由器 1. 樹莓派 # rpi - send.py # 或者命令行&#xff1a;arecord -D plughw:1,0 -t wav -f cd -r 16000 -c 2 | nc 192.168.8.162 12345import socket imp…

公司內部建立apt源

有一篇建立pypi源的在這里需要的可以查看&#xff1a;公司內部建立pypi源-CSDN博客 背景&#xff0c;公司內部有很多工具僅供內部使用&#xff0c;如果用apt的方式就比較方便&#xff0c;只需要修改sources.list將源添加進去就可以了。我們接下來的操作就是為了實現這個需求。…

UE5中如何修復后處理動畫藍圖帶來的自然狀態下的metablriger身體綁定形變(如聳肩)問題

【[metablriger] UE5中如何修復后處理動畫藍圖帶來的自然狀態下的metablriger身體綁定形變(如聳肩)問題】 UE5中如何修復后處理動畫藍圖帶來的自然狀態下的metablriger身體綁定形變(如聳肩)問題