使用深度學習的交通標誌檢測
交通標誌是我們道路安全中最重要的部分,因為它們會在您開車行駛之前告訴您重要的事情。在主要交叉路口或十字路口須遵循的指示,指引司機確保道路交通安全和正常行駛。
每年大約有135萬人由於道路交通事故死亡。世界上大多數國家的政府都強制要求遵守交通規則和標誌。
在當今這個時代,世界各地的工程師都在嘗試使用自動駕駛系統和高階駕駛員輔助系統
(ADAS)等現代技術來減少交通事故,檢測道路標誌同樣重要。
概述
在這裡,我們將嘗試使用卷積神經網路(CNN)等深度學習技術解決手頭的問題。我們將使用德國交通標誌資料集來訓練我們的神經網路。
資料
讓我們來看看這些資料的重要特徵,如下所示 -
- 多級分類問題。
- 超過40個分類。
- 總共超過50,000張圖片。
- 影像大小在15x15到250x250畫素之間變化。
- 交通標誌的邊界框是註釋的一部分。
我們的資料集中有43種獨特型別的交通標誌,這使得它成為使用神經網路的多類分類問題。我們的影像是RGB格式,我們將轉換為灰度。這將降低模型複雜度(需要調優的超引數的數量),並且這將迫使模型學習幾何形狀(符號的形狀)。
我們還將對資料進行歸一化調整,以避免由於特徵的分佈範圍對權重進行過度補償/欠補償。
類分佈
從上圖中可以看出,資料集在本質上是高度不平衡的。這可能意味著我們經過訓練的模型可能會偏向具有更大數量的類。
讓我們訓練模型來檢測交通標誌
我們從基本的CNN架構開始,並嘗試使用Adadelta作為損失最佳化器來減少分類交叉熵損失。我們將使用ReLU作為卷積的啟用函式,我們將在最後一層新增Softmax。
模型架構
網路由兩個卷積層組成,每個層都有ReLU啟用,第一層包含8個核心,核心大小為3x3,第二層包含16個核心,核心大小為3x3。接下來是MaxPooling層,然後是Dropout層,其Dropout率為0.75。然後我們將輸出展平,將其輸入到具有128個神經元的Dense層中。我們再新增一個Dropout層,其Dropout率為0.5。最後新增一個具有softmax啟用的輸出層。
epochs = 10
batch_size = 128
num_classes = 43
model = Sequential()
model.add(Conv2D(
8, kernel_size=(3, 3), activation='relu', input_shape=input_shape
))
model.add(Conv2D(16, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.75))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(
loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']
)
model.summary()
history = model.fit(
x_train, y_train, batch_size=batch_size, epochs=epochs,
verbose=1, validation_data=(x_test, y_test)
)
我們可以使用上面程式碼中“ history ”變數中的資訊來繪製訓練損失和測試損失,我們得到如下圖表。
從圖中可以看出,每個週期之後,訓練和驗證損失都在穩步下降。並且該模型的Macro F1分數計算為0.97。
視覺化特徵對映
想知道了解卷積神經網路如何看待輸入影像?我們可以明確的看到每一層的輸出!程式碼如下。
layer_outputs = [layer.output for layer in model.layers]
activation_model = Model(inputs=model.input, outputs=layer_outputs)
def display_activation(activations, col_size, row_size, act_index):
activation = activations[act_index]
activation_index=0
fig, ax = plt.subplots(row_size, col_size, figsize=(row_size*2.5,col_size*1.5))
for row in range(0,row_size):
for col in range(0,col_size):
ax[row][col].imshow(activation[0, :, :, activation_index], cmap='gray')
activation_index += 1
plt.show()
# we are going to see the output of image no 11722 after
# each convolution layer
idx = 11722
activations = activation_model.predict(x_test[idx].reshape(1, 64, 64, 1))
對於特定影像,並非所有核心都由ReLU啟用函式啟用。因此,我們將在第一層中看到最活躍的核心的特徵圖。我們還在第一層繪製了一個顯示核心啟用的折線圖。
從圖中可以看出,即使核心6的特徵識別有一些峰值,這個特定輸入影像的大多數特徵都被核心4識別。儘管核心啟用中有一些很好的峰值,但是上面的影像是錯誤分類的。輸入影像的實際類是5,但是我們的訓練模型預測它是類2。讓我們用條形圖來看看前5個機率。
模型預測第2類的機率超過0.5,但實際情況是影像屬於第5類,而我們訓練的模型僅給出該類的機率超過0.3。
因此我們需要稍微改變模型架構。
我們 將 CNN架構的第一層和第二層中 的核心數量加倍 ,重新訓練模型並使用與上述相同的測試影像進行測試。這次,模型預測了正確的類, 機率 超過 0.8 ,整體Macro F1分數為0.9825。
我已經訓練了六種不同架構的模型,並試圖穩步減少損失。
遷移學習
遷移學習是一種允許我們使用從其他任務中獲得的知識的方法,以便快速有效地解決新的類似的問題。這減少了對於我們正在處理的特定任務相關的資料的需求。
在這種情況下,我們只使用CNN模型的一部分。我們在體系結構的末尾丟棄完全連線的層,然後您可以使用卷積層的輸出特徵來訓練ML模型,或者您可以新增自己的完全連線的層並對其進行調優。
我使用VGG16,Inception,ResNet和RetinaNet進行了轉移學習,以便直觀地檢測交通標誌。
到目前為止我遇到的最有趣的神經網路之一是RetinaNet。它可以執行迴歸(用於邊界框)和分類。上圖顯示的是在這個資料集上訓練的RetinaNet模型的類似的輸出。
結論
現在我們知道深度學習在解決計算機視覺等問題方面是非常有用的。在這個專案中,我們透過訓練多個CNN模型架構,可以實現高達99%的Macro F1分數。
透過這個專案,我學到了很多東西並且在使用像Keras,TensorFlow,Matplotlib和Pandas這樣的庫在Python中編寫程式碼時獲得了實踐經驗。
下圖顯示的是模型的比較:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2649302/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深度學習之目標檢測深度學習
- 機器學習在交通標誌檢測與精細分類中的應用機器學習
- 使用深度學習檢測瘧疾深度學習
- 52 個深度學習目標檢測模型深度學習模型
- 深度學習之目標檢測與目標識別深度學習
- 深度學習之影像目標檢測速覽深度學習
- 深度學習:乳腺x檢測深度學習
- 基於OpenCV和YOLOv3深度學習的目標檢測OpenCVYOLO深度學習
- 深度學習與CV教程(13) | 目標檢測 (SSD,YOLO系列)深度學習YOLO
- 深度學習目標檢測(object detection)系列(六)YOLO2深度學習ObjectYOLO
- 深度學習目標檢測(object detection)系列(一) R-CNN深度學習ObjectCNN
- 深度學習“吃雞外掛”——目標檢測 SSD 實驗深度學習
- 深度學習目標檢測(object detection)系列(五) R-FCN深度學習Object
- 深度學習之瑕疵缺陷檢測深度學習
- 深度學習目標檢測(object detection)系列(四) Faster R-CNN深度學習ObjectASTCNN
- 《基於深度學習的目標檢測綜述》論文獲發表深度學習
- 基於深度學習的計算機視覺應用之目標檢測深度學習計算機視覺
- 【深度學習】檢測CUDA、cuDNN、Pytorch是否可用深度學習DNNPyTorch
- 用深度學習進行欺詐檢測深度學習
- Pytorch 目標檢測學習 Day 2PyTorch
- 目標檢測演算法學習演算法
- Selective Search——Region Proposal的源頭 (目標檢測)(two-stage)(深度學習)(IJCV 2013)深度學習
- 深度學習與CV教程(12) | 目標檢測 (兩階段,R-CNN系列)深度學習CNN
- [譯] 如何輕鬆地在樹莓派上使用深度學習檢測物件樹莓派深度學習物件
- 拯救深度學習:標註資料不足下的深度學習方法深度學習
- 52 個深度學習目標檢測模型彙總,論文、原始碼一應俱全!深度學習模型原始碼
- 51 個深度學習目標檢測模型彙總,論文、原始碼一應俱全!深度學習模型原始碼
- faced:基於深度學習的CPU實時人臉檢測深度學習
- 幽默:交通標誌是一種符號和交通語言符號
- 交通事件檢測方案事件
- 深度學習技術在網路入侵檢測中的應用深度學習
- 用 PHP 與深度學習模型進行物體檢測PHP深度學習模型
- 深入學習OpenCV檢測及分割影象的目標區域OpenCV
- 深度模型的日誌異常檢測,還有誰不會?模型
- 深度學習|基於MobileNet的多目標跟蹤深度學習演算法深度學習演算法
- 什麼是深度學習的影片標註?深度學習
- 52 個深度學習目標檢測模型彙總,論文、原始碼一應俱全!(附連結)深度學習模型原始碼
- Python深度學習(使用 Keras 回撥函式和 TensorBoard 來檢查並監控深度學習模型)--學習筆記(十六)Python深度學習Keras函式ORB模型筆記