天天看點

TX2+TensorRT+DIGITS實作圖像的識别、檢測和分割---2---圖像識别(一)

TX2+TensorRT+DIGITS實作圖像的識别、檢測和分割---2---圖像識别(一)

Classifying Images with ImageNet

TensorRT下載下傳位址:https://developer.nvidia.com/nvidia-tensorrt-download

TesnsoRT介紹文檔:https://devblogs.nvidia.com/tensorrt-3-faster-tensorflow-inference/

TensorRT開發者指南:http://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html

TensorRT樣例代碼:http://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#samples

這裡有多種類型的深度學習網絡可以利用,包括識别,檢測/定位,和分割。第一個在本教程中重點出現的是利用’imageNet’來實作的圖像識别功能,它是被訓練來識别相似物體的。

imageNet會輸入一個圖檔,然後輸出這張圖檔中的物體是各個類别的機率。上面step 2中下載下傳的模型,是利用ImageNet資料庫(1000種類别)訓練的AlexNet和GoogleNet的網絡模型。作為樣例,它提供了一個指令行的接口(imagenet-console) 和一個實時的攝像頭程式(imagenet-camera)。

Using the Console Program on Jetson

首先,嘗試使用imagenet-console程式在測試圖檔上試驗一下圖像識别功能。它會加載一張圖檔,使用TensorRT和imageNet的類别來進行推演。推演完成後,他會把推演的結果(類别資訊或者編号)加載到圖檔上(類似水印的方式),并且将輸出結果儲存。

在編譯好jetson-inference之後,進入aarch64/bin這個檔案夾:

$ cd jetson-inference/build/aarch64/bin
           

然後用imagenet-console來識别樣例圖檔。imagenet-console允許兩個指令行參數:輸入圖檔的路徑和輸出圖檔(會加蓋類别資訊的水印)的路徑

TX2+TensorRT+DIGITS實作圖像的識别、檢測和分割---2---圖像識别(一)
TX2+TensorRT+DIGITS實作圖像的識别、檢測和分割---2---圖像識别(一)

接下來,我們将會利用imageNet來識别一個基于Jetson闆載攝像頭的實時視訊

Running the Live Camera Recognition Demo

就像上面最後一個例子,實時圖像識别Demo是在/aarch64/bin的下面的一個叫做imagenet-camera的程式。通過設定參數,可以利用googleNet/Alexnet和TensorRT來對實時視訊流進行識别。

$ ./imagenet-camera googlenet           # to run using googlenet
$ ./imagenet-camera alexnet             # to run using alexnet
           

在OpenGL的視窗最上面的Title Bar裡面,會列印出目前視訊識别的FPS(frames per second),識别類别的名字和識别類别的置信值(是某種類别的可能性或者機率)。系統預設這個程式可以識别最多1000種不同種類的物體。具體原因是這裡面用的GoogleNet和AlexNet都是基于ILSVRC12 ImageNet的資料庫訓練的,這個資料庫包含了1000種不同的物體。您可以在這裡找到每一張圖檔對應的1000種不同物體的名字。

注:系統預設中Jetson的闆載CSI攝像頭将會作為輸入視訊。如果你想用usb 攝像頭來代替它,你可以在imagenet-camera.cpp中改變DEFAULT_CAMERA的值。目前的測試是利用羅技 C920來做的。

TX2+TensorRT+DIGITS實作圖像的識别、檢測和分割---2---圖像識别(一)
TX2+TensorRT+DIGITS實作圖像的識别、檢測和分割---2---圖像識别(一)

Re-training the Network with DIGITS

我們剛才用過的下載下傳好的GoogleNet和AlexNet的模型,是基于已經标記好的ImageNet ILSVRC12訓練好的。

.

如果來識别新的目标類别,您可以使用DIGITS來基于新的資料重新訓練一個網絡模型。您還可以以不同的方式組織現有的類,包括将多個子類組合成一個。例如在本教程中,我們将采用1000個類别中的230個,将這些類别分為12個班級,并重新訓練網絡。

接下來我們來下載下傳ILSVRC12的圖檔來訓練,或者你可以把自己的資料庫放到Image Folder中來替代。

Downloading Image Recognition Dataset

一個圖像資料集包含了大量的圖檔,他們會根據不同的類别存放在不同的檔案夾中。ILSVRC12資料集被用于訓練預設的GoogleNet和AlexNet模型。它大概有100GB的大小,包含1000種不同類别的1百萬張圖檔。您可以利用imagenet-download.py這個腳本來下載下傳資料集到您的DIGITS中。如果想下載下傳這個資料集,首先要确認您的DIGITS伺服器有足夠的空間(120GB以上的預留白間),然後再您想要下載下傳的伺服器上運作以下指令:

$ wget --no-check-certificate https://nvidia.box.com/shared/static/gzr5iewf5aouhc5exhp3higw6lzhcysj.gz -O ilsvrc12_urls.tar.gz
$ tar -xzvf ilsvrc12_urls.tar.gz
$ wget https://rawgit.com/dusty-nv/jetson-inference/master/tools/imagenet-download.py
$ python imagenet-download.py ilsvrc12_urls.txt . --jobs  --retry  --sleep 
           

上面的指令會下載下傳圖檔的URLs位址的清單。

注:運作這個下載下傳圖像資料集的腳本時間可能很長(100GB的檔案,下載下傳也許會過夜),是以請確定網絡的通暢

下載下傳腳本會在對應的子檔案夾裡面存儲這些圖檔。每一類圖檔将會存在對應的名字的檔案夾下面,一共1000個檔案夾對應ILSVRC12的每一個類。檔案夾會以下面的形式組織起來:

n01440764/
n01443537/
n01484850/
n01491361/
n01494475/
...
           

這些8個數字的id用n作為字首,每個類代表了相近類别的代号。每一類的名字你可以在ilsvrc12_synset_words.txt檢視。舉個例子:n01484850 great white shark

Customizing the Object Classes

我們上一步下載下傳的資料庫會用來訓練預設的AlexNet和GoogleNet,它會分為1000個類,包括鳥類,水果,植物,魚類,狗,貓科動物和交通工具等等。出于實踐的目的,讓我們考慮一下Google網模型的一個同類,該模型識别由最初的1000個類組成的十幾個核心組(舉個例子:把所有的不同的狗類,都算成狗一個類)。這12個核心組可能比1000個單獨的同步集更實用,并且跨類組合可以獲得更多的教育訓練資料和更強的性能。

DIGITS中的資料要求存儲在分層次的檔案夾中,是以我們為每個核心組建立一個檔案夾,并且對應每一個檔案夾到之前下載下傳的ILSVRC12的同步集中。DIGITS會自動組合來自頂層組下所有檔案夾的圖像。檔案夾結構就像下面展示的,類名字後面括号裡的數值代表包含的類的數量,括号裡面箭頭後面的數值代表同步集合每一個類對應的編号,

‣ ball/  ()
    • baseball     (→n02799071)
    • basketball   (→n02802426)
    • soccer ball  (→n04254680)
    • tennis ball  (→n04409515)
    • ...
‣ bear/  ()
    • brown bear   (→n02132136)
    • black bear   (→n02133161)
    • polar bear   (→n02134084)
    • sloth bear   (→n02134418)
• bike/  ()
• bird/  ()
• bottle/ ()
• cat/  ()
• dog/  ()
• fish/   ()
• fruit/  ()
• turtle/  ()
• vehicle/ ()
• sign/  ()
           

因為ILSVRC12中有太多了類别,為了友善大家生成目錄結構和資料集路徑連結,我們提供了一個腳本imagenet-subset.sh。在DIGITS伺服器上執行以下指令:

$ wget https://rawgit.com/dusty-nv/jetson-inference/master/tools/imagenet-subset.sh
$ chmod +x imagenet-subset.sh
$ mkdir classes
$ ./imagenet-subset.sh /opt/datasets/imagenet/ilsvrc12 classes
           

在這個例子中,會生成一個12個類的連結,第一個參數代表着之前步驟中下載下傳的ILSVRC12的檔案夾的路徑。

Importing Classification Dataset into DIGITS

通過浏覽器登陸上DIGITS,選擇Dataset中右上角的New Dataset中的Classification。

TX2+TensorRT+DIGITS實作圖像的識别、檢測和分割---2---圖像識别(一)

将圖檔路徑設定為之前的12類資料集的檔案夾路徑,然後:

• 将for validation 設定為10

• Group Name設定為:ImageNet

• Dataset Name 設定為:ImageNet-ILSVRC12-subset

TX2+TensorRT+DIGITS實作圖像的識别、檢測和分割---2---圖像識别(一)

然後點選最下面的Create按鈕開始建立資料庫。資料集大小是20GB左右,根據電腦的IO性能,大概需要處理10~15分鐘。接下來我們會建立模型并訓練模型。

Creating Image Classification Model with DIGITS

當建立資料集完成,傳回到DIGITS的首頁中。選擇Models,然後選擇右上角的New Model,然後選擇Classification來建立一個新的模型。

TX2+TensorRT+DIGITS實作圖像的識别、檢測和分割---2---圖像識别(一)

在後面的頁面中,按照下面來設定:

• Select Dataset: ImageNet-ILSVRC12-subset

• Subtract Mean: Pixel

• Standard Networks: GoogleNet

• Group Name: ImageNet

• Model Name: GoogleNet-ILSVRC12-subset

選擇一個GPU來訓練,點選Create按鈕開始訓練

TX2+TensorRT+DIGITS實作圖像的識别、檢測和分割---2---圖像識别(一)

繼續閱讀