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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch 吸烟检测yolov5s

發(fā)布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch 吸烟检测yolov5s 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

YOLOV5s +吸煙目標檢測

參考學習

文章目錄

      • 本原創(chuàng)項目長期更新,旨在完成校園異常行為實時精檢測,作到集成+N次開發(fā)+優(yōu)化(不止局限于調(diào)包)為止,近期將不斷更新如下模型+數(shù)據(jù)+標注文件+教程。關(guān)注博主,Star 一下github,一塊兒開始美妙的目標檢測之路吧~~
    • 1、項目展現(xiàn)
    • 2、項目資源共享
        • 1:訓練圖片:香煙圖片+吸煙手勢+煙霧
    • 3、實踐教學
      • 3.1環(huán)境配置
      • 3.2數(shù)據(jù)標注與預(yù)處理
        • 3.2.1附上本身的Lablimg簡易教學:
        • 3.2.2 幾個本身寫的腳本用于轉(zhuǎn)換數(shù)據(jù)集與訓練前準備
        • 3.2.3 切分訓練集與測試集:
    • 4、開始訓練
      • 4.1:開始訓練
      • 4.2:訓練過程
      • 4.3:訓練優(yōu)化
      • 4.4 訓練參數(shù):
    • 5、實時檢測
      • 運行detect.py便可
    • 6、YOLO系列可視化對比
    • 7、寫在后面
      • 所有連接傳送門

?

? 首先:附上Github傳送門:https://github.com/CVUsers/Smoke-Detect-by-YoloV5/tree/master,而后根據(jù)本文手把手配置環(huán)境+訓練本身數(shù)據(jù),或者使用我訓練好的模型進行使用。用yolov5s訓練好的已經(jīng)放在了里面,用大模型訓練的因為大小緣由,須要的話能夠戳最下方微信私聊我,免費。python

1、項目展現(xiàn)

左圖為原圖,右圖為推理后的圖片,以圖片方式展現(xiàn),視頻流和實時流也能達到這個效果,因為視頻大小緣由,暫不上傳,感興趣的朋友細細往下看,并點個關(guān)注喲!git

測試配置:GTX1050ti,不堪入目,可是實驗效果還不錯,再這樣弱的配置下,使用YOLOv5s,YOlov5m等皆能達到30fps。github

2、項目資源共享

1:訓練圖片:香煙圖片+吸煙手勢+煙霧

香煙圖片:本身編寫爬蟲爬了1w張,篩選下來有近1000張可用,以及其余途徑獲取到的,總共暫時5k張,將來會愈來愈多,后續(xù)須要的能夠私聊我,如今先放出5k張圖片,另外加上本身辛辛苦苦使用Labelimg標注的幾千張圖片的XML文件也一并送上,香煙圖片質(zhì)量可查傳送門:連接:https://pan.baidu.com/s/1t8u94x51TO7pLciU8AoaiQ
提取碼:n2wr:以下圖web

吸煙手勢圖片:算法

火災(zāi)+煙霧數(shù)據(jù)集:微信

這個數(shù)據(jù)集我已經(jīng)有了10萬左右數(shù)據(jù),部分是朋友的,不知能不能開源,我能夠送上本身收集的幾萬數(shù)據(jù)集。傳送門:框架

項目框架:YOLOV5——Pytorch實現(xiàn)dom

送上做者源碼傳送門:https://github.com/ultralytics/yolov5,固然也能夠直接使用個人:https://github.com/CVUsers/Smoke-Detect-by-YoloV5/tree/master。ide

標注工具:Labelimgsvg

附上Windows工具:在我上面的github里面有喲:下載好放置桌面比較方便。

3、實踐教學

3.1環(huán)境配置

本例以使用YOLov5做者源碼步驟:

Cython numpy==1.17 opencv-python torch>=1.4 matplotlib pillow tensorboard PyYAML>=5.3 torchvision scipy tqdm

個人是torch 1.5 gpu版

在git clone下做者的v5源碼后: 目錄切至requirement.txt 下而后

pip install -U -r requirements.txt

若是須要使用混合精度模型來作訓練:安裝Apex

git clone https://github.com/NVIDIA/apex && cd apex 而后切換至目錄下 pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" . --user && cd .. && rm -rf apex

3.2數(shù)據(jù)標注與預(yù)處理

以吸煙數(shù)據(jù)集為例:

在百度網(wǎng)盤下載好個人數(shù)據(jù)集和XML

如果想從新訓練的話

3.2.1附上本身的Lablimg簡易教學:

標注好會生成XML文件:XML里面包含了四個點坐標和圖片的名字與size。

而后在data下新建幾個文件夾:

將咱們的XML文件放至Annotations

將咱們的圖片放到images

在ImageSets中新建Main 和test.txt 和train.txt

再新建labels存放接下來生成的標簽

3.2.2 幾個本身寫的腳本用于轉(zhuǎn)換數(shù)據(jù)集與訓練前準備

第一個:XML文件轉(zhuǎn)label.txt文件

首先寫個os操做讀一下data/images中圖片:這個幾行搞定,要注意要寫成我這樣的喲 (不用生成.jpg)能夠經(jīng)過split(’.’)再復(fù)制到ImageXML中

而后運行voc_label.py腳本:

# 坐標xml轉(zhuǎn)txt import os import xml.etree.ElementTree as ETclasses = ["smoke"] # 輸入名稱,必須與xml標注名稱一致def convert(size, box):print(size, box)dw = 1. / size[0]dh = 1. / size[1]x = (box[0] + box[1]) / 2.0y = (box[2] + box[3]) / 2.0w = 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(image_id):print(image_id)in_file = open(r'./data/Annotations/%s.xml' % (image_id), 'rb') # 讀取xml文件路徑out_file = open('./data/labels/%s.txt' % (image_id), 'w') # 須要保存的txt格式文件路徑tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):cls = obj.find('name').textif cls not in classes: # 檢索xml中的名稱continuecls_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)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')image_ids_train = open('./ImageXML.txt').read().strip().split() # 讀取xml文件名索引for image_id in image_ids_train:print(image_id)convert_annotation(image_id)

須要注意,如果有中文路徑的話,請這樣讀文件:

open(r'./data/Annotations/%s.xml' % (image_id), 'rb')

接下來就會在data/labels中看到:全部的txt標簽

每一個txt文本會生成一共5個數(shù)字:第一個是整形的數(shù),表示類別:0表明第一類,以此類推,后面四個數(shù)字是坐標經(jīng)過歸一化后的表示。

3.2.3 切分訓練集與測試集:

執(zhí)行train_test_split.py

import os import randomtrainval_percent = 1 # 可自行進行調(diào)節(jié) train_percent = 1 xmlfilepath = './data/Annotations' txtsavepath = './data/ImageSets\Main' 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('ImageSets/Main/trainval.txt', 'w') ftest = open('./data/ImageSets/Main/test.txt', 'w') ftrain = open('./data/ImageSets/Main/train.txt', 'w') # fval = open('ImageSets/Main/val.txt', 'w')for i in list:name = total_xml[i][:-4] + '\n'if i in trainval:# ftrainval.write(name)if i in train:ftest.write(name)# else:# fval.write(name)else:ftrain.write(name)# ftrainval.close() ftrain.close() # fval.close() ftest.close()

其中trainval_percent = 1表示驗證集比例,1表明1:9 若是有5000張圖片,就會切割成4500張訓練集,和500張驗證集。

trainval_percent = 1 # 可自行進行調(diào)節(jié)

運行path_trans補全路徑,并寫入train.txt

import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import joinsets = ['train', 'test']classes = ['smoke'] # 本身訓練的類別def convert(size, box):dw = 1. / size[0]dh = 1. / size[1]x = (box[0] + box[1]) / 2.0y = (box[2] + box[3]) / 2.0w = 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(image_id):in_file = open('data/Annotations/%s.xml' % (image_id), 'rb')out_file = open('data/labels/%s.txt' % (image_id), 'w')tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_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)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')wd = getcwd() for image_set in sets:if not os.path.exists('data/labels/'):os.makedirs('data/labels/')image_ids = open('data/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()list_file = open('data/%s.txt' % (image_set), 'w')for image_id in image_ids:list_file.write('data/images/%s.jpg\n' % (image_id))convert_annotation(image_id)list_file.close()

接下來編寫yaml文本:
見smoke.yaml

將咱們上一步生成的train.txt 和test.txt 補全路徑后的這兩個txt路徑寫入到y(tǒng)aml中,而后nc:修改成本身類別的數(shù)量,以及names【‘smoke’】

4、開始訓練

4.1:開始訓練

在上面咱們作好數(shù)據(jù)預(yù)處理后,就能夠開始訓練了,上面的一些處理步驟,每一個人均可能不一樣,不過大致上思路是一致的。

接下來咱們能夠進行預(yù)訓練,下載官方的預(yù)訓練模型:
yolov5s yolov5m yolov5l yolov5x來 我在個人github中方了yolov5s,比較小,只有25mb,專門為移動端考慮了,真好。

固然也能夠不使用預(yù)訓練模型,使用與否,在總時間上是差很少的,不過

為何要使用預(yù)訓練模型?

做者已盡其所能設(shè)計了基準模型。咱們能夠在本身的數(shù)據(jù)集上使用預(yù)訓練模型,而不是從頭構(gòu)建模型來解決相似的天然語言處理問題。

盡管仍然須要進行一些微調(diào),但它已經(jīng)為咱們節(jié)省了大量的時間:一般是每一個損失降低更快和計算資源節(jié)省

加快梯度降低的收斂速度

更有可能得到一個低模型偏差,或者低泛化偏差的模型

下降因未初始化或初始化不當致使的梯度消失或者梯度爆炸問題。此狀況會致使模型訓練速度變慢,崩潰,直至失敗。

其中隨機初始化,能夠打破對稱性,從而保證不一樣的隱藏單元能夠?qū)W習到不一樣的東西

接下來開始訓練:

python train.py --data data/smoke.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --batch-size 10 --epochs 100

解釋一下:

咱們–data data/smoke.yaml 中就是在smoke.yaml中撰寫的訓練代碼路徑和類別等data,經(jīng)過這個獲取訓練的圖片和label標簽等。

而后-cfg models/yolov5s.yaml 和 --weights weights/yolov5s.pt是獲取配置和預(yù)訓練模型權(quán)重

batch-size 10 你們都懂,default是16,你們能夠改為16,在yolov5s中模型參施很少,百萬左右,因此顯存消耗很少,個人配置不好,顯存4g,在使用yolov5m中以及不能調(diào)到16。

會報cuda out of memory 報錯,就把batch size下降就行。

而后最后是epoch,這個也不用解釋,我在使用yolov5m訓練5k張圖片在100epoch中花費 了24小時,一個epoch13分鐘。

訓練過程當中,會慢慢在runs中生成tensorboard,可視化損失降低

固然也能夠在本地稍微看看:

這幅圖中,咱們的類別只有1個,第三幅圖顯示了咱們數(shù)據(jù)中的寬高比,歸一化后,廣泛在0.1左右,說明數(shù)據(jù)確實很小,也會面臨模糊問題,致使數(shù)據(jù)質(zhì)量下降。

4.2:訓練過程

分別是epoch,顯存消耗…其余的你們能夠查看源碼

4.3:訓練優(yōu)化

使用混合精度模型

在前面配置好環(huán)境后:

mixed_precision = True try: # Mixed precision training https://github.com/NVIDIA/apexfrom apex import amp except:print('Apex recommended for faster mixed precision training: https://github.com/NVIDIA/apex')mixed_precision = False # not installed

判斷是否可用apex作混合精度模型訓練

而后

if mixed_precision:model, optimizer = amp.initialize(model, optimizer, opt_level='O1', verbosity=0)

在optimizer中amp初始化一下 o1表明級別,注意是歐 不是零。

接著:

if mixed_precision:with amp.scale_loss(loss, optimizer) as scaled_loss:scaled_loss.backward()

優(yōu)化反向傳播。

組裝到cuda訓練

opt.img_size.extend([opt.img_size[-1]] * (2 - len(opt.img_size))) # extend to 2 sizes (train, test)device = torch_utils.select_device(opt.device, apex=mixed_precision, batch_size=opt.batch_size)if device.type == 'cpu':mixed_precision = False

4.4 訓練參數(shù):

詳情參見注釋。

5、實時檢測

運行detect.py便可

其中,推理一張圖片,那么就在–source中的default寫上圖片路徑,

也能夠如圖寫上整個圖片文件夾,這樣會檢測全部圖片。

也能夠?qū)懮弦曨l地址和視頻文件夾,檢測全部視頻,存放于inference 的out中。

改為0 就是實時檢測了~默認電腦攝像頭,固然也能夠改為手機。這個也很簡單,須要的能夠私聊我,微信會放在最下方。

幀率很高,普通設(shè)備也能達到30+,可謂是速度極快,要是你們設(shè)備好一些,能夠試一下YOLOv5L和YOLOV5x,跑完了能夠私聊分享一下,與我交流。

6、YOLO系列可視化對比

類別100類

每類300張圖片

測試圖片1087張,閥值0.5 ,預(yù)測正確

yolov3-tiny yolov4 yolov5

預(yù)測結(jié)果 737 954 955

模型大小 33.97M 246.19M 28.99M(yolov5s.pt)

yolov5s的精度和yolov4差很少,但模型大小只有yolov4的11.77%(我的數(shù)據(jù)集,數(shù)據(jù)可能有點誤差,但仍是能說明問題的)

實時對比

附上視頻:https://www.bilibili.com/video/av328439400/

7、寫在后面

這篇文章大體介紹了yolov5的自訓練,接下來咱們能夠進行調(diào)優(yōu)。已經(jīng)作消融對比實驗,慢慢的更熟悉目標檢測。繼續(xù)我會在下篇中介紹文中的一些技術(shù)棧,讓你們知根知底。

所有連接傳送門

最后再發(fā)一次全部的連接!

香煙數(shù)據(jù)集:連接:https://pan.baidu.com/s/1t8u94x51TO7pLciU8AoaiQ
提取碼:n2wr

吸煙手勢數(shù)據(jù)集:連接:https://pan.baidu.com/s/1BSH4yn3GBzF3hDTWAqKzDQ
提取碼:9r8t

煙霧數(shù)據(jù)集:連接:https://pan.baidu.com/s/1RKvkkmfpHiPunkFMAEdoAQ
提取碼:ag0x

YOLOv5 原做者github:https://github.com/ultralytics/yolov5

個人github :https://github.com/CVUsers/Smoke-Detect-by-YoloV5/tree/master?歡迎star ,將長期更新!

最后還有不少知識點沒分享,關(guān)注一下博主,下次分享。

另外歡迎加入深度學習算法交流群,與群內(nèi)工程師朋友門一塊兒交流學術(shù),共商算法,加油!

?

總結(jié)

以上是生活随笔為你收集整理的pytorch 吸烟检测yolov5s的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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