使用 TensorFlow 和 Mobilenetv2 的樂高積木圖像分類(上)


選自:Medium

作者:Alejandro J Rod

Lego 積木數據集預處理

我們想使用 CNN 創建深度學習模型,該模型能夠按圖像分類對 Lego 積木進行分類。第一步是選擇數據集。

仔細檢查了幾個選項,我們發現並選擇了一個非常適合這個項目的數據集:來自 kaggle的數據集。它包含 20,300 張 Lego 積木和普通積木的圖像,但是我們選擇僅使用 Lego 圖像;它也包含正常圖像和裁剪後的圖像,我們僅使用裁剪後的圖像——因為這樣可以更好地訓練模型。

現在有了數據集,就可以開始創建模型所需的結構。我們選擇了一種使用文件夾結構作為定義類和子類的方法。對於本例來說,只需要 6 個類,因為數據集只包含這些類別。


使用 TensorFlow 和 Mobilenetv2 的樂高積木圖像分類(上)

文件夾和應用程序類

在定義了數據集並按預期分離圖像之後,我們繼續對數據進行預處理。在這個階段,我們要獲取圖像,將其傳遞到灰度級,再把所有圖像的維度重新整形為相同的維度,轉換為數組。

通過下方的 GitHub 託管鏈接可查看“預處理要用於 DeepLearning 模型的圖像”的長代碼:

https://gist.github.com/AlejoCR/a0ebba6e51df5913df8805282d3b60ba

數據準備好後,先將它保存起來,這樣就不需要每次在數據集上運行測試時都重新進行處理。

對 Lego 積木圖像分類器進行模型訓練

_現在來選擇要使用的框架和深度學習方法,由於我們將在 Jetson Nano 上運行推理模型,因此需要能夠在限資源的 GPU 設備上運行。由於我們使用的是圖像應用,因此我們將使用卷積神經網絡(CNN),CNN 能提供良好的精度,也不需要強大的硬件。

TensorFlow

因為要在 Jetson Nano中部署項目,所以我們必須考慮到框架的問題。

TensorFlow 是用於機器學習的端到端開源平臺。它是具有工具、庫和社區資源的全面靈活的生態系統,可以讓研究人員推動 ML 領域的最新發展,同時讓開發人員輕鬆構建和部署 ML 支持的應用程序。

TensorFlow 最初是由 Google 機器智能研究組織內 Google Brain 團隊的研究人員和工程師開發的,用於進行機器學習和深度神經網絡研究。由於有足夠的通用性,TensorFlow 也可以適用於多種其他領域。

TensorFlow 提供穩定的 Python 和 C ++ API,以及其他語言的非保證向後兼容 API 。

還有一個非常重要的功能是:TensorFlow 支持 GPU。因為 Jetson Nano 就有一個 GPU,所以我們想要使用處理器來提高深度學習應用程序的性能。

GPU 的操作可以通過 Nvidia 驅動程序,Cuda Toolkit 來完成。在最新版本上,我們也可以使用 TensorRT—— 一個高性能深度學習推理的平臺。它包括深度學習推理優化器和運行時,可以為深度學習推理的應用程序提供低延遲和高吞吐量。在推理過程中,基於 TensorRT 的應用程序的運行速度,比僅基於 CPU 平臺的快 40 倍。

MobileNetV2

通過對 Jetson Nano 的深度學習測試,我們發現 MobileNetV2 具有更好的性能。

使用 TensorFlow 和 Mobilenetv2 的樂高積木圖像分類(上)

利用 Jetson Nano 和 TensorRT,使用 FP16 精度和批量大小對各種深度學習推理網絡進行了性能分析

MobileNetV2 是由 Google 開發的卷積神經網絡(CNN),旨在為視覺應用創建高性能和高精度的神經網絡,並應用於資源有限的移動設備上。

MobileNetV2 也是 MobileNetV1 的改進,它使用了深度可分離卷積。此外,V2 為該體系結構引入了兩個新功能:層之間的線性瓶頸和瓶頸之間的快捷連接。它的基本結構如下所示:

使用 TensorFlow 和 Mobilenetv2 的樂高積木圖像分類(上)

MobileNetV2 基本結構

深度卷積是普通卷積的一種變體。常規的 2D 卷積,是在多個輸入通道上執行的,濾波器與輸入一樣深,讓我們自由地混合通道來生成輸出中每個元素;但是深度卷積每個通道保持獨立。

而深度可分卷積,在深度可分卷積完成之後,將執行另一個步驟:跨信道的 1x1 卷積。對於不同的輸出通道,可以多次重複這個步驟。所有的輸出通道均採用深度步進的輸出,並將它與不同的 1x1 卷積混合在一起。


使用 TensorFlow 和 Mobilenetv2 的樂高積木圖像分類(上)

深度可分卷積

Residual blocks 使用跳躍鏈接連接卷積塊的開始和結束。通過添加這兩種狀態,可以讓網絡訪問沒有在卷積塊中修改的早期激活,這個方法對於構建深度網絡至關重要。

下圖為 Inverted residual block。斜線陰影紋理表示不包含非線性的圖層。它提供了構件塊(瓶頸層)的輸入/輸出域與層轉換(將輸入轉換為輸出的非線性函數)之間的自然分離。前者可以看作是網絡在每一層的容量,而後者則是表現力。


使用 TensorFlow 和 Mobilenetv2 的樂高積木圖像分類(上)

我們之所以在神經網絡中使用非線性激活函數,是因為多個矩陣乘法不能被簡化為一個單一的數值運算,它允許構建多層的神經網絡。同時,神經網絡中常用的激活函數 ReLU 會丟棄小於 0 的值,為了提高網絡的容量,可以通過增加信道的數量來解決信息丟失的問題。

對於 inverted residual blocks,我們做相反的事情,並擠壓跳過連接所鏈接的層, 這會損害網絡的性能。作者介紹了線性瓶頸的概念,其中殘差塊的最後卷積在將其添加到初始激活之前具有線性輸出。將其放入代碼非常簡單,因為我們只是丟棄了卷積塊的最後一個激活函數

MobileNetV2的結構如下圖所示,其中每一行描述1個或多個相同(modulo stride)層的序列,重複n次。同一序列中的所有層具有相同數量的輸出通道。每個序列的第一層有一個 stride s,其他都使用 stride 1,所有空間卷積都使用 3×3 的 kernels。

使用 TensorFlow 和 Mobilenetv2 的樂高積木圖像分類(上)

MobilenetV2 結構

為 Lego 積木圖像分類器重新訓練 mobilenetV2

實現模型的障礙之一是時間和硬件資源。所以當我們嘗試在短時間(約2周)內實施該項目時,並沒有考慮使用帶有硬件的 PC 來實現高性能的操作,而是選擇了基於 MobilenetV2 的遷移學習進行實施的選項。

現代圖像識別模型有數百萬個參數,從頭開始訓練它們需要大量帶標籤的訓練數據和大量計算能力(數百個 GPU 小時或更長時間)。而遷移學習就是一種簡化的技巧,它可以選擇一部分已經在相關任務上訓練過的模型,然後重用在一個新的模型中。本教程將重用 ImageNet 上經過訓練的強大圖像分類器的特徵提取功能,並在上面簡單地訓練新的分類層。

雖然這樣比不上訓練完整模型,但是對於許多應用程序來說卻已經極其有效了。它可以處理少量的訓練數據(數千個,而不是數百萬個帶標籤的圖像),並且在不使用 GPU 的筆記本電腦上運行30分鐘。

為了在 MobilenetV2 上實施再訓練,我們選擇使用 TensorFlow Hub。TensorFlow Hub 是一個用於發佈、發現和使用機器學習模型的可重用部分的庫。模塊是TensorFlow 圖表的自包含部分,連同它的重量和資產,可以在遷移學習的過程中跨不同任務重用。遷移學習可以:

  • 用較小的數據集訓練模型;
  • 提高泛化能力;
  • 加快訓練速度。

為了安裝 TensorFlow Hub,我們只需要在命令下方運行即可。

<code>$ pip install tensorflow-hub/<code>

訓練用於 Lego 積木的 MobilenetV2

為了重新訓練網絡,我們在 Github 上使用了此腳本獲取圖像,並執行為推理模型創建凍結圖和標籤文件的過程。

使用此文件,我們運行以下命令:

<code>python retrain.py \\    --image_dir〜/ lego_bricks \\    --tfhub_module https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/3 \\    --random_crop = 5 \\    --random_brightness = 5 \\    --random_scale = 5 \\    --flip_left_right \\    --summaries_dir = mobilenetv2 \\    --learning_rate = 0.02 \\    --how_many_training_steps = 4000 \\/<code>

在這裡,我們通過開關 tfhub_module 選擇神經網絡的類型。其他的開關則被用來在圖像中加入“噪聲”,包括剪裁、亮度、隨機縮放和翻轉。我們還將學習率調整為 0.02,以增加默認值 0.1。這個過程執行 4000 步。

這個過程之後,我們得到了經過訓練的模型結果如下:

使用 TensorFlow 和 Mobilenetv2 的樂高積木圖像分類(上)

訓練模型的準確性

使用 TensorFlow 和 Mobilenetv2 的樂高積木圖像分類(上)

訓練模型的損耗變化

一旦獲得此模型,就可以在 Jetson Nano 上繼續實現。這個內容我們將在第三部分展開。


原文鏈接:

https://medium.com/lego-brick-image-classification-running-on-jetson

✄----------------------------------

本文由頭條號「黑胡桃實驗室」敲制,歡迎非商業轉載。轉載請帶上頭條號名稱及原文鏈接,並在文章開頭明顯位置註明原文地址、原文作者、譯文地址和譯者,以表示對作者和譯者的感謝。


>黑胡桃社區學習平臺

黑胡桃社的 Codelabs 學習通道,繼續為每一個想要學習人工智能技術的老師、同學提供學習內容和學習用 GPU。

想要“宅家學習”的老師或同學請用電腦訪問:

https://blackwalnut.tech/tfboost/introduce ,可以跟隨任務管理一步步學習,也可以在平臺上進行自己的開發和研究。學習過程中如果遇到障礙歡迎隨時聯繫“黑胡桃實驗室小助手”獲得幫助!


分享到:


相關文章: