使用深度學習的交通標誌檢測

dicksonjyl560101發表於2019-07-02




使用深度學習的交通標誌檢測

交通標誌是我們道路安全中最重要的部分,因為它們會在您開車行駛之前告訴您重要的事情。在主要交叉路口或十字路口須遵循的指示,指引司機確保道路交通安全和正常行駛。

每年大約有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啟用函式啟用。因此,我們將在第一層中看到最活躍的核心的特徵圖。我們還在第一層繪製了一個顯示核心啟用的折線圖。

使用深度學習的交通標誌檢測

圖1:CNN的輸入影像 圖2:第一層最活躍核心的輸出

使用深度學習的交通標誌檢測

從圖中可以看出,即使核心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中編寫程式碼時獲得了實踐經驗。

下圖顯示的是模型的比較:

使用深度學習的交通標誌檢測

CNN架構及其測試MacroF1分數


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2649302/,如需轉載,請註明出處,否則將追究法律責任。

相關文章