怎么查看網(wǎng)站提交百度的度手機優(yōu)化助手下載
文章目錄
- 0 前言
- 1 基于YOLO的火焰檢測與識別
- 2 課題背景
- 3 卷積神經(jīng)網(wǎng)絡
- 3.1 卷積層
- 3.2 池化層
- 3.3 激活函數(shù):
- 3.4 全連接層
- 3.5 使用tensorflow中keras模塊實現(xiàn)卷積神經(jīng)網(wǎng)絡
- 4 YOLOV5
- 4.1 網(wǎng)絡架構圖
- 4.2 輸入端
- 4.3 基準網(wǎng)絡
- 4.4 Neck網(wǎng)絡
- 4.5 Head輸出層
- 5 數(shù)據(jù)集準備
- 5.1 數(shù)據(jù)標注簡介
- 5.2 數(shù)據(jù)保存
- 6 模型訓練
- 6.1 修改數(shù)據(jù)配置文件
- 6.2 修改模型配置文件
- 6.3 開始訓練模型
- 7 實現(xiàn)效果
- 7.1圖片效果
- 7.2 視頻效果
- 7.3 攝像頭實時效果
- 8 最后
0 前言
🔥 優(yōu)質競賽項目系列,今天要分享的是
🚩 基于深度學習的火焰識別算法研究與實現(xiàn)
該項目較為新穎,適合作為競賽課題方向,學長非常推薦!
🥇學長這里給一個題目綜合評分(每項滿分5分)
- 難度系數(shù):4分
- 工作量:4分
- 創(chuàng)新點:3分
🧿 更多資料, 項目分享:
https://gitee.com/dancheng-senior/postgraduate
1 基于YOLO的火焰檢測與識別
學長設計系統(tǒng)實現(xiàn)效果如下,精度不錯!
2 課題背景
火災事故的頻發(fā)給社會造成不必要的財富損失以及人員傷亡,在當今這個社會消防也是收到越來越多的注視?;馂脑诎l(fā)生初期是很容易控制的,因此,如何在對可能發(fā)生災害的場所進行有效監(jiān)控,使得潛在的損失危害降到最低是當前研究的重點內容。傳統(tǒng)的探測器有較大的局限性,感溫、感煙的探測器的探測靈敏度相對爭分奪秒的災情控制來說有著時間上的不足,而且戶外場所的適用性大大降低。隨著計算機視覺的發(fā)展,基于深度學習的圖像處理技術已經(jīng)愈發(fā)成熟并且廣泛應用在當今社會的許多方面,其在人臉識別、安防、醫(yī)療、軍事等領域已經(jīng)有相當一段時間的實際應用,在其他領域也展現(xiàn)出跟廣闊的前景。利用深度學習圖像處理技術對火災場景下火焰的特征學習、訓練神經(jīng)網(wǎng)絡模型自動識別火焰,這項技術可以對具有監(jiān)控攝像頭場景下的火災火焰進行自動、快速、準確識別并設置預警裝置,從而在火災發(fā)生的初期及時響應,贏得更多的時間,把損失降到最低。
3 卷積神經(jīng)網(wǎng)絡
受到人類大腦神經(jīng)突觸結構相互連接的模式啟發(fā),神經(jīng)網(wǎng)絡作為人工智能領域的重要組成部分,通過分布式的方法處理信息,可以解決復雜的非線性問題,從構造方面來看,主要包括輸入層、隱藏層、輸出層三大組成結構。每一個節(jié)點被稱為一個神經(jīng)元,存在著對應的權重參數(shù),部分神經(jīng)元存在偏置,當輸入數(shù)據(jù)x進入后,對于經(jīng)過的神經(jīng)元都會進行類似于:y=w*x+b的線性函數(shù)的計算,其中w為該位置神經(jīng)元的權值,b則為偏置函數(shù)。通過每一層神經(jīng)元的邏輯運算,將結果輸入至最后一層的激活函數(shù),最后得到輸出output。
3.1 卷積層
卷積核相當于一個滑動窗口,示意圖中3x3大小的卷積核依次劃過6x6大小的輸入數(shù)據(jù)中的對應區(qū)域,并與卷積核滑過區(qū)域做矩陣點乘,將所得結果依次填入對應位置即可得到右側4x4尺寸的卷積特征圖,例如劃到右上角3x3所圈區(qū)域時,將進行0x0+1x1+2x1+1x1+0x0+1x1+1x0+2x0x1x1=6的計算操作,并將得到的數(shù)值填充到卷積特征的右上角。
3.2 池化層
池化操作又稱為降采樣,提取網(wǎng)絡主要特征可以在達到空間不變性的效果同時,有效地減少網(wǎng)絡參數(shù),因而簡化網(wǎng)絡計算復雜度,防止過擬合現(xiàn)象的出現(xiàn)。在實際操作中經(jīng)常使用最大池化或平均池化兩種方式,如下圖所示。雖然池化操作可以有效的降低參數(shù)數(shù)量,但過度池化也會導致一些圖片細節(jié)的丟失,因此在搭建網(wǎng)絡時要根據(jù)實際情況來調整池化操作。
3.3 激活函數(shù):
激活函數(shù)大致分為兩種,在卷積神經(jīng)網(wǎng)絡的發(fā)展前期,使用較為傳統(tǒng)的飽和激活函數(shù),主要包括sigmoid函數(shù)、tanh函數(shù)等;隨著神經(jīng)網(wǎng)絡的發(fā)展,研宄者們發(fā)現(xiàn)了飽和激活函數(shù)的弱點,并針對其存在的潛在問題,研宄了非飽和激活函數(shù),其主要含有ReLU函數(shù)及其函數(shù)變體
3.4 全連接層
在整個網(wǎng)絡結構中起到“分類器”的作用,經(jīng)過前面卷積層、池化層、激活函數(shù)層之后,網(wǎng)絡己經(jīng)對輸入圖片的原始數(shù)據(jù)進行特征提取,并將其映射到隱藏特征空間,全連接層將負責將學習到的特征從隱藏特征空間映射到樣本標記空間,一般包括提取到的特征在圖片上的位置信息以及特征所屬類別概率等。將隱藏特征空間的信息具象化,也是圖像處理當中的重要一環(huán)。
3.5 使用tensorflow中keras模塊實現(xiàn)卷積神經(jīng)網(wǎng)絡
?
class CNN(tf.keras.Model):def __init__(self):super().__init__()self.conv1 = tf.keras.layers.Conv2D(filters=32, # 卷積層神經(jīng)元(卷積核)數(shù)目kernel_size=[5, 5], # 感受野大小padding='same', # padding策略(vaild 或 same)activation=tf.nn.relu # 激活函數(shù))self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)self.conv2 = tf.keras.layers.Conv2D(filters=64,kernel_size=[5, 5],padding='same',activation=tf.nn.relu)self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)self.flatten = tf.keras.layers.Reshape(target_shape=(7 * 7 * 64,))self.dense1 = tf.keras.layers.Dense(units=1024, activation=tf.nn.relu)self.dense2 = tf.keras.layers.Dense(units=10)def call(self, inputs):x = self.conv1(inputs) # [batch_size, 28, 28, 32]x = self.pool1(x) # [batch_size, 14, 14, 32]x = self.conv2(x) # [batch_size, 14, 14, 64]x = self.pool2(x) # [batch_size, 7, 7, 64]x = self.flatten(x) # [batch_size, 7 * 7 * 64]x = self.dense1(x) # [batch_size, 1024]x = self.dense2(x) # [batch_size, 10]output = tf.nn.softmax(x)return output
4 YOLOV5
我們選擇當下YOLO最新的卷積神經(jīng)網(wǎng)絡YOLOv5來進行火焰識別檢測。6月9日,Ultralytics公司開源了YOLOv5,離上一次YOLOv4發(fā)布不到50天。而且這一次的YOLOv5是完全基于PyTorch實現(xiàn)的!在我們還對YOLOv4的各種高端操作、豐富的實驗對比驚嘆不已時,YOLOv5又帶來了更強實時目標檢測技術。按照官方給出的數(shù)目,現(xiàn)版本的YOLOv5每個圖像的推理時間最快0.007秒,即每秒140幀(FPS),但YOLOv5的權重文件大小只有YOLOv4的1/9。
目標檢測架構分為兩種,一種是two-stage,一種是one-stage,區(qū)別就在于 two-stage 有region
proposal過程,類似于一種海選過程,網(wǎng)絡會根據(jù)候選區(qū)域生成位置和類別,而one-stage直接從圖片生成位置和類別。今天提到的 YOLO就是一種
one-stage方法。YOLO是You Only Look Once的縮寫,意思是神經(jīng)網(wǎng)絡只需要看一次圖片,就能輸出結果。YOLO
一共發(fā)布了五個版本,其中 YOLOv1 奠定了整個系列的基礎,后面的系列就是在第一版基礎上的改進,為的是提升性能。
YOLOv5有4個版本性能如圖所示:
4.1 網(wǎng)絡架構圖
YOLOv5是一種單階段目標檢測算法,該算法在YOLOv4的基礎上添加了一些新的改進思路,使其速度與精度都得到了極大的性能提升。主要的改進思路如下所示:
4.2 輸入端
在模型訓練階段,提出了一些改進思路,主要包括Mosaic數(shù)據(jù)增強、自適應錨框計算、自適應圖片縮放;
- Mosaic數(shù)據(jù)增強:Mosaic數(shù)據(jù)增強的作者也是來自YOLOv5團隊的成員,通過隨機縮放、隨機裁剪、隨機排布的方式進行拼接,對小目標的檢測效果很不錯
4.3 基準網(wǎng)絡
融合其它檢測算法中的一些新思路,主要包括:Focus結構與CSP結構;
4.4 Neck網(wǎng)絡
在目標檢測領域,為了更好的提取融合特征,通常在Backbone和輸出層,會插入一些層,這個部分稱為Neck。Yolov5中添加了FPN+PAN結構,相當于目標檢測網(wǎng)絡的頸部,也是非常關鍵的。
FPN+PAN的結構
這樣結合操作,FPN層自頂向下傳達強語義特征(High-Level特征),而特征金字塔則自底向上傳達強定位特征(Low-
Level特征),兩兩聯(lián)手,從不同的主干層對不同的檢測層進行特征聚合。
FPN+PAN借鑒的是18年CVPR的PANet,當時主要應用于圖像分割領域,但Alexey將其拆分應用到Yolov4中,進一步提高特征提取的能力。
4.5 Head輸出層
輸出層的錨框機制與YOLOv4相同,主要改進的是訓練時的損失函數(shù)GIOU_Loss,以及預測框篩選的DIOU_nms。
對于Head部分,可以看到三個紫色箭頭處的特征圖是40×40、20×20、10×10。以及最后Prediction中用于預測的3個特征圖:
?
①==>40×40×255②==>20×20×255③==>10×10×255
?
-
相關代碼
class Detect(nn.Module):stride = None # strides computed during buildonnx_dynamic = False # ONNX export parameterdef __init__(self, nc=80, anchors=(), ch=(), inplace=True): # detection layersuper().__init__()self.nc = nc # number of classesself.no = nc + 5 # number of outputs per anchorself.nl = len(anchors) # number of detection layersself.na = len(anchors[0]) // 2 # number of anchorsself.grid = [torch.zeros(1)] * self.nl # init gridself.anchor_grid = [torch.zeros(1)] * self.nl # init anchor gridself.register_buffer('anchors', torch.tensor(anchors).float().view(self.nl, -1, 2)) # shape(nl,na,2)self.m = nn.ModuleList(nn.Conv2d(x, self.no * self.na, 1) for x in ch) # output convself.inplace = inplace # use in-place ops (e.g. slice assignment)def forward(self, x):z = [] # inference outputfor i in range(self.nl):x[i] = self.m[i](x[i]) # convbs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()if not self.training: # inferenceif self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)y = x[i].sigmoid()if self.inplace:y[..., 0:2] = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i] # xyy[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # whelse: # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953xy = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i] # xywh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # why = torch.cat((xy, wh, y[..., 4:]), -1)z.append(y.view(bs, -1, self.no))return x if self.training else (torch.cat(z, 1), x)def _make_grid(self, nx=20, ny=20, i=0):d = self.anchors[i].deviceif check_version(torch.__version__, '1.10.0'): # torch>=1.10.0 meshgrid workaround for torch>=0.7 compatibilityyv, xv = torch.meshgrid([torch.arange(ny).to(d), torch.arange(nx).to(d)], indexing='ij')else:yv, xv = torch.meshgrid([torch.arange(ny).to(d), torch.arange(nx).to(d)])grid = torch.stack((xv, yv), 2).expand((1, self.na, ny, nx, 2)).float()anchor_grid = (self.anchors[i].clone() * self.stride[i]) \.view((1, self.na, 1, 1, 2)).expand((1, self.na, ny, nx, 2)).float()return grid, anchor_grid
5 數(shù)據(jù)集準備
由于目前針對多源場景下的火焰數(shù)據(jù)并沒有現(xiàn)成的數(shù)據(jù)集,我們使用使用Python爬蟲利用關鍵字在互聯(lián)網(wǎng)上獲得的圖片數(shù)據(jù),爬取數(shù)據(jù)包含室內場景下的火焰、寫字樓和房屋燃燒、森林火災和車輛燃燒等場景下的火焰圖片。經(jīng)過篩選后留下3000張質量較好的圖片制作成VOC格式的實驗數(shù)據(jù)集。
深度學習圖像標注軟件眾多,按照不同分類標準有多中類型,本文使用LabelImg單機標注軟件進行標注。LabelImg是基于角點的標注方式產(chǎn)生邊界框,對圖片進行標注得到xml格式的標注文件,由于邊界框對檢測精度的影響較大因此采用手動標注,并沒有使用自動標注軟件。
考慮到有的朋友時間不足,博主提供了標注好的數(shù)據(jù)集和訓練好的模型,需要請聯(lián)系。
5.1 數(shù)據(jù)標注簡介
通過pip指令即可安裝
?
pip install labelimg
在命令行中輸入labelimg即可打開
打開你所需要進行標注的文件夾,點擊紅色框區(qū)域進行標注格式切換,我們需要yolo格式,因此切換到y(tǒng)olo
點擊Create RectBo -> 拖拽鼠標框選目標 -> 給上標簽 -> 點擊ok
5.2 數(shù)據(jù)保存
點擊save,保存txt。
打開具體的標注文件,你將會看到下面的內容,txt文件中每一行表示一個目標,以空格進行區(qū)分,分別表示目標的類別id,歸一化處理之后的中心點x坐標、y坐標、目標框的w和h。
6 模型訓練
預訓練模型和數(shù)據(jù)集都準備好了,就可以開始訓練自己的yolov5目標檢測模型了,訓練目標檢測模型需要修改兩個yaml文件中的參數(shù)。一個是data目錄下的相應的yaml文件,一個是model目錄文件下的相應的yaml文件。
6.1 修改數(shù)據(jù)配置文件
修改data目錄下的相應的yaml文件。找到目錄下的voc.yaml文件,將該文件復制一份,將復制的文件重命名,最好和項目相關,這樣方便后面操作。我這里修改為fire.yaml。
打開這個文件夾修改其中的參數(shù),需要檢測的類別數(shù),我這里是識別有無火焰,所以這里填寫2;最后箭頭4中填寫需要識別的類別的名字(必須是英文,否則會亂碼識別不出來)。到這里和data目錄下的yaml文件就修改好了。
6.2 修改模型配置文件
由于該項目使用的是yolov5s.pt這個預訓練權重,所以要使用models目錄下的yolov5s.yaml文件中的相應參數(shù)(因為不同的預訓練權重對應著不同的網(wǎng)絡層數(shù),所以用錯預訓練權重會報錯)。同上修改data目錄下的yaml文件一樣,我們最好將yolov5s.yaml文件復制一份,然后將其重命名
打開yolov5s.yaml文件,主要是進去后修改nc這個參數(shù)來進行類別的修改,修改如圖中的數(shù)字就好了,這里是識別兩個類別。
至此,相應的配置參數(shù)就修改好了。
目前支持的模型種類如下所示:
6.3 開始訓練模型
如果上面的數(shù)據(jù)集和兩個yaml文件的參數(shù)都修改好了的話,就可以開始yolov5的訓練了。首先我們找到train.py這個py文件。
然后找到主函數(shù)的入口,這里面有模型的主要參數(shù)。修改train.py中的weights、cfg、data、epochs、batch_size、imgsz、device、workers等參數(shù)
至此,就可以運行train.py函數(shù)訓練自己的模型了。
訓練代碼成功執(zhí)行之后會在命令行中輸出下列信息,接下來就是安心等待模型訓練結束即可。
7 實現(xiàn)效果
我們實現(xiàn)了圖片檢測,視頻檢測和攝像頭實時檢測接口,用Pyqt自制了簡單UI
?
#部分代碼from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Win_mask(object):def setupUi(self, Win_mask):Win_mask.setObjectName("Win_mask")Win_mask.resize(1107, 868)Win_mask.setStyleSheet("QString qstrStylesheet = \"background-color:rgb(43, 43, 255)\";\n""ui.pushButton->setStyleSheet(qstrStylesheet);")self.frame = QtWidgets.QFrame(Win_mask)self.frame.setGeometry(QtCore.QRect(10, 140, 201, 701))self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)self.frame.setFrameShadow(QtWidgets.QFrame.Raised)self.frame.setObjectName("frame")self.pushButton = QtWidgets.QPushButton(self.frame)self.pushButton.setGeometry(QtCore.QRect(10, 40, 161, 51))font = QtGui.QFont()font.setBold(True)font.setUnderline(True)font.setWeight(75)self.pushButton.setFont(font)self.pushButton.setStyleSheet("QPushButton{background-color:rgb(151, 191, 255);}")self.pushButton.setObjectName("pushButton")self.pushButton_2 = QtWidgets.QPushButton(self.frame)self.pushButton_2.setGeometry(QtCore.QRect(10, 280, 161, 51))font = QtGui.QFont()font.setBold(True)font.setUnderline(True)font.setWeight(75)self.pushButton_2.setFont(font)self.pushButton_2.setStyleSheet("QPushButton{background-color:rgb(151, 191, 255);}")self.pushButton_2.setObjectName("pushButton_2")self.pushButton_3 = QtWidgets.QPushButton(self.frame)self.pushButton_3.setGeometry(QtCore.QRect(10, 500, 161, 51))QtCore.QMetaObject.connectSlotsByName(Win_mask)
?
7.1圖片效果
7.2 視頻效果
7.3 攝像頭實時效果
8 最后
🧿 更多資料, 項目分享:
https://gitee.com/dancheng-senior/postgraduate