RoBoard魔人的機器人日誌

2019/5/14

[Jetson Nano] 用攝影機來定位物體

大家好,

今天本魔要來和大家分享如何用 Jetson Nano 接攝影機來定位物體,

和上一篇一樣,

定位物體的方法有下列這些:

  1. facenet (偵測臉部)
  2. multiped (偵測複數行人與行李箱)
  3. pednet (偵測行人)
  4. coco-bottle (偵測瓶子)
  5. coco-dog (偵測狗)

如果各位用的鏡頭是 CSI camera 就只要直接執行指令就可以了,輸入:
$ ./detectnet-camera facenet
$ ./detectnet-camera multiped
$ ./detectnet-camera pednet
$ ./detectnet-camera coco-bottle
$ ./detectnet-camera coco-dog
$ ./detectnet-camera                # 不輸入時使用 multiped 方法

但因為本魔使用的是 USB Camera,

所以必須要更改設定,

首先輸入:
$ ls -ltrh /dev/video*
你將會找到所有視訊裝置的編號,

知道我們的 USB Camera 是編號幾之後就可以更改程式的設定了,輸入:
$ sudo gedit ~/jetson-inference/detectnet-camera/detectnet-camera.cpp
然後將 DEFAULT_CAMERA 改為剛剛我們找到的編號,

本魔電腦偵測到的為 0,如圖:



修改完成後就可以儲存並關閉 gedit 了。

接著我們要重新編譯程式,輸入:
$ cd ~/getson-inference/build/
$ cmake ../
$ make
$ sudo make install
完成後就可以回到 bin 資料夾,並執行程式囉!輸入:
$ cd aarch64/bin/
$ ./detectnet-camera facenet
本魔使用的是 facenet 來定位臉部,

畢竟要辨識其它物體還要特地找有點麻煩。

第一次建造模型同樣會花費較多時間,所以請耐心等待一下。

接著你會看到你的鏡頭畫面被顯示在螢幕上了,

我們快點來試試看有什麼臉可以辨識吧!

首先是 3D 列印的一個達爾文頭像:


看來只能定位到本魔的臉而已呢!

 接著拿蕾姆的公仔來試試:


看來還是只有定位出本魔阿!

再來試試之前一樣用 3D 列印印出的骷髏頭,

本魔還幫它加上了頭髮和眼睛嘴巴,


竟然辨識到了!

是不是本魔畫得太維妙維肖了呢!?



本篇的教學就到此為止啦~,

各位一樣可以嘗試用看看其它的方法哦!

喜歡這個系列的話可以追蹤我的blogger哦,

Jetson Nano 官方教學基本上到此為止啦~,

接下來的教學因為要在 PC 上跑,

所以還不確定什麼時候會整理出來和大家分享哦。

如果有疑問或任何指教也歡迎在下方留言提出哦!
Share:

2019/5/13

[Jetson Nano] 定位圖像中的物體

大家好,

今天本魔要繼續和分享如何用 Jetson Nano 來定位圖像中的物體,

在官方提供的範例中我們可以辨識定位以下這些物體:

  1. ped-100 (偵測行人)
  2. multiped-500 (偵測複數行人與行李箱)
  3. facenet-120 (偵測臉部)
  4. coco-airplane (偵測飛機)
  5. coco-bottle (偵測瓶子)
  6. coco-chair (偵測椅子)
  7. coco-dog (偵測狗)

知道有這些方法可以使用後我們可以很簡單的執行 detectnet-console 這隻程式來做辨識定位,

開啟 Terminal 視窗並輸入:
$ cd ~/jetson-inference/build/aarch64/bin/
進入 bin 資料夾後執行 detectnet-console,輸入:
$ ./detectnet-console dog_0.jpg output-1.jpg coco-dog
將 dog_0 這張圖輸出成 output-1 並使用 coco-dog 這個方法,

在第一次執行時一樣會較花時間,請耐心等待。

執行完後在資料夾下會多出一張 output-1 的圖片,

我們可以打開來看:


有狗的部分都被框起來了呢!

看來有準確的定位。

我們繼續執行指令,輸入:
$ ./detectnet-console dog_1.jpg output-2.jpg coco-dog
因為 coco-dog 有執行過了,所以這一次會較快一些,

完成後一樣開啟 output-2 來看:


我們繼續執行:
$ ./detectnet-console dog_2.jpg output-3.jpg coco-dog


在馬路上趴著的狗也能定位出來呢!

接著辨識瓶子,因為 coco-bottle 和剛剛的方法不同,所以一樣會執行較久,輸入:
$ ./detectnet-console bottle_0.jpg output-4.jpg coco-bottle

這隻貓可愛

即使旁邊有其它物體也能準確定位出瓶子,

接著試試看飛機:
$ ./detectnet-console airplane_0.jpg output-5.jpg coco-airplane


本魔嚴重懷疑這張官方提供的圖是P上去的!

這兩台飛機飛這麼近沒有航空法上的問題嗎!?

總之還是辨識出來了~,

接著辨識複數行人與行李箱:
$ ./detectnet-console peds-001.jpg output-6.jpg multiped


 4個人都被準確的定位出來了呢!

繼續執行:
$ ./detectnet-console peds-002.jpg output-7.jpg multiped


即便只有背影也不會誤判呢!

接著試試一個較複雜的圖,輸入:
$ ./detectnet-console peds-003.jpg output-8.jpg multiped


行人和行李箱都被定位出來了,

但中間的女生拖著的行李箱似乎沒定位到呢!

是不是那裡的人太密集了呢?

繼續看下一張,輸入:
$ ./detectnet-console peds-004.jpg output-9.jpg multiped


側身照一樣可以精準的定位出來,

接下來本魔也測試了一下非官方提供的圖片:


沒錯,就是當時的史加納團隊照,

即使蹲著也可以定位呢!

但為什麼本魔被特別再框一次了呢!?

看來 Jetson Nano 連本魔的霸王色霸氣都能定位到阿,太厲害了!



本篇的教學就到此為止啦~,

各位一樣可以嘗試用其它圖片來測試看看哦!

喜歡這個系列的話可以追蹤我的blogger哦,

本魔近期都會不定時更新此系列教學,

如果有疑問或任何指教也歡迎在下方留言提出哦!
Share:

2019/5/10

[Jetson Nano] 用攝影機來辨識物體

大家好,

上一篇已經和各位介紹了如何讀取圖片來辨識物體,

今天本魔要繼續和大家分享如何用 Jetson Nano 接 USB Camera 來辨識物體。

如果各位用的鏡頭是 CSI camera 就只要直接執行指令就可以了,輸入:
$ cd ~/jetson-inference/build/aarch64/bin/
$ ./imagenet-camera googlenet
但因為本魔使用的是 USB Camera,

所以必須要更改設定,

首先輸入:
$ ls -ltrh /dev/video*
你將會找到所有視訊裝置的編號,

知道我們的 USB Camera 是編號幾之後就可以更改程式的設定了,輸入:
$ sudo gedit ~/jetson-inference/imagenet-camera/imagenet-camera.cpp
然後將 DEFAULT_CAMERA 改為剛剛我們找到的編號,

本魔電腦偵測到的為 0,如圖:


修改完成後就可以儲存並關閉 gedit 了。

接著我們要重新編譯程式,輸入:
$ cd ~/jetson-inference/build/
$ cmake ../
$ make
$ sudo make install
完成後就可以回到 bin 資料夾,並執行程式囉!輸入:
$ cd aarch64/bin/
$ ./imagenet-camera googlenet 
接著你會看到你的鏡頭畫面被顯示在螢幕上了:


左上角可以看到和之前範例一樣的物體描述,

本魔隨意拿了手邊的幾樣東西來測試了一下:


隨手拿了一個馬克杯辨識結果為 Coffee mug,正確!


手上剛好握著滑鼠,來辨識一下,Computer mouse,正確!


夏天快到了,拿個小電風扇來辨識一下,Electric fan,電扇無誤!


針筒...,syringe,注射器無誤!

咦?你問我為什麼會帶著針筒?

不要問,很可怕!



本篇的教學就到此為止啦~,

各位一樣可以嘗試用其它物品來測試看看哦!

喜歡這個系列的話可以追蹤我的blogger哦,

本魔近期都會不定時更新此系列教學,

如果有疑問或任何指教也歡迎在下方留言提出哦!
Share:

2019/5/9

[Jetson Nano] 自己寫一個圖像識別程式

大家好,

今天本魔要繼續和大家分享如何自己寫一個圖像識別程式,

上一篇我們已經用官方的範例做出分類辨識的效果了,

今天要來做一個更完整的辨識程式,

首先打開 Terminal 視窗並輸入:


$ mkdir ~/my-recognition
$ cd ~/my-recognition
$ touch my-recognition.cpp
$ touch CMakeLists.txt
完成後你會看到家目錄下多了一個 my-recognition 資料夾,

並且裡面有 my-recognition.cpp 與 CMakeLists.txt,

如下圖:


接著我們下載一些官方提供的範例圖片:

$ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/black_bear.jpg 
$ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/brown_bear.jpg
$ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/polar_bear.jpg 
完成後會多出三張圖:


接著可以來寫程式囉!

用 gedit 來開啟 my-recognition.cpp 編輯:
$ gedit my-recognition.cpp

接著在 貼上下面的程式:

// include imageNet header for image recognition
#include 

// include loadImage header for loading images
#include 

// main entry point
int main( int argc, char** argv )
{
 // a command line argument containing the image filename is expected,
 // so make sure we have at least 2 args (the first arg is the program)
 if( argc < 2 )
 {
  printf("my-recognition:  expected image filename as argument\n");
  printf("example usage:   ./my-recognition my_image.jpg\n");
  return 0;
 }

 // retrieve the image filename from the array of command line args
 const char* imgFilename = argv[1];

 // these variables will be used to store the image data and dimensions
 // the image data will be stored in shared CPU/GPU memory, so there are
 // pointers for the CPU and GPU (both reference the same physical memory)
 float* imgCPU    = NULL;    // CPU pointer to floating-point RGBA image data
 float* imgCUDA   = NULL;    // GPU pointer to floating-point RGBA image data
 int    imgWidth  = 0;       // width of the image (in pixels)
 int    imgHeight = 0;       // height of the image (in pixels)
  
 // load the image from disk as float4 RGBA (32 bits per channel, 128 bits per pixel)
 if( !loadImageRGBA(imgFilename, (float4**)&imgCPU, (float4**)&imgCUDA, &imgWidth, &imgHeight) )
 {
  printf("failed to load image '%s'\n", imgFilename);
  return 0;
 }

 // load the GoogleNet image recognition network with TensorRT
 // you can use imageNet::ALEXNET to load AlexNet model instead
 imageNet* net = imageNet::Create(imageNet::GOOGLENET);

 // check to make sure that the network model loaded properly
 if( !net )
 {
  printf("failed to load image recognition network\n");
  return 0;
 }

 // this variable will store the confidence of the classification (between 0 and 1)
 float confidence = 0.0;

 // classify the image with TensorRT on the GPU (hence we use the CUDA pointer)
 // this will return the index of the object class that the image was recognized as (or -1 on error)
 const int classIndex = net->Classify(imgCUDA, imgWidth, imgHeight, &confidence);


 // make sure a valid classification result was returned 
 if( classIndex >= 0 )
 {
  // retrieve the name/description of the object class index
  const char* classDescription = net->GetClassDesc(classIndex);

  // print out the classification results
  printf("image is recognized as '%s' (class #%i) with %f%% confidence\n", 
     classDescription, classIndex, confidence * 100.0f);
 }
 else
 {
  // if Classify() returned < 0, an error occurred
  printf("failed to classify image\n");
 }

 // free the network's resources before shutting down
 delete net;

 // this is the end of the example!
 return 0;
}



簡單的說明一下這段程式在做些什麼,

首先用第二個引數來讀取圖片,然後載入圖像辨識網路 (GOOGLENET),

接著會將載入的圖片做分類與看相似度,

最後將結果輸出至銀幕上。

接著我們要寫 CMakeLists.txt,一樣用 gedit 來開啟 CMakeLists.txt 編輯:
$ gedit CMakeLists.txt
接著貼上:

# require CMake 2.8 or greater
cmake_minimum_required(VERSION 2.8)

# declare my-recognition project
project(my-recognition)

# import jetson-inference and jetson-utils packages.
# note that if you didn't do "sudo make install"
# while building jetson-inference, this will error.
find_package(jetson-utils)
find_package(jetson-inference)

# CUDA and Qt4 are required
find_package(CUDA)
find_package(Qt4)

# setup Qt4 for build
include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})

# compile the my-recognition program
cuda_add_executable(my-recognition my-recognition.cpp)

# link my-recognition to jetson-inference library
target_link_libraries(my-recognition jetson-inference)



完成後就可以編譯囉!輸入:

$ cd ~/my-recognition
$ cmake .
$ make
完成後就可以執行程式來進行辨識啦!

輸入:
$ ./my-recognition polar_bear.jpg

輸出結果 ice bear、polar bear 是北極熊無誤!

輸入:
$ ./my-recognition brown_bear.jpg


結果是 brown bear 棕熊無誤。

輸入:
$ ./my-recognition black_bear.jpg


結果是 American black bear 美國黑熊,「真的假的?連國家都辨識的出來阿?」

玩到這裡同事 Vic 忽然說,該不會它只能辨識這些官方圖片吧?

所以本魔就上網找了一隻猴子,畢竟也是有毛髮的動物,到底有沒有辦法辨別呢?


結果是 guenon monkey 正確,本魔找的時候不知道牠的品種是長尾猴呢!

結果 Vic 不信邪說了:「該不會檔名會影響它的辨識吧?」

所以本魔又找了一張金剛的圖片,並將檔名存為 aaa.jpg,


結果是 gorilla 大猩猩,本魔還以為會辨識出 King kong 呢!

上網查了一下,原來金剛就是大猩猩,只是金剛是通俗的講法,

所以還是算辨識正確!



本篇的教學就到此為止啦~,

各位一樣可以嘗試用其它圖片來測試看看哦!

喜歡這個系列的話可以追蹤我的blogger哦,

本魔近期都會不定時更新此系列教學,

如果有疑問或任何指教也歡迎在下方留言提出哦!
Share:

2019/5/8

[Jetson Nano] 用 ImageNet 對圖像進行分類

大家好,

今天本魔要繼續和大家分享如何用 Jetson Nano 來做圖像分類,

這是上次我們安裝的 Hello AI World 其中一個範例,

首先我們要將目錄切換至我們上次編譯完的目錄下,開啟 Terminal 視窗並輸入:
$ cd jetson-inference/build/aarch64/bin
然後執行 imagenet-console 這支程式,輸入:
$ ./imagenet-console orange_0.jpg output_0.jpg
第一個參數 orange_0.jpg 是你要讓他進行分類的圖片,

第二個參數 output_0.jpg 則是你要匯出的圖片。

在第一次運行程序時,TensorRT 可能需要幾分鐘優化網絡,

但運行完成後,優化的網絡將會存起來,因此之後的運行速度會比較快。

完成後各位可以到資料夾下看看是不是多了一個 output_0.jpg 的圖片,


或是各位可以輸入:
$ display orange_0.png
也可以看到輸出後的圖片:


可以看到左上角它會顯示分類的名稱與相似度,

很明顯這是一顆柳橙,

我們可以再匯入其它圖片試試,
$ ./imagenet-console granny_smith_1.jpg output_1.jpg


一樣可以用 display 指令來開啟圖片:
$ display output_1.png

很明顯這是一顆青蘋果,

它的英文讓本魔困惑了一下,Granny Smith?史密斯奶奶?

結果上了 wiki 查了一下原來是澳洲青蘋,

以下是 wiki 的描述:
它是在1868年在澳大利亞一次無意中由一位「老奶奶」瑪麗亞·安·舍伍德·史密斯(Maria Ann Sherwood Smith)繁殖的。因此其英文名成為紀念這位史密斯老奶奶(Granny Smith)

原來是個人名阿!長知識了呢!



本篇的教學就到此為止啦~,

各位可以嘗試用其它圖片來測試看看哦!

喜歡這個系列的話可以追蹤我的blogger哦,

本魔近期都會不定時更新此系列教學,

如果有疑問或任何指教也歡迎在下方留言提出哦!
Share:
技術提供:Blogger.

追蹤者