# NVIDIA Jetson Nano Developer Kit
## NVIDIA Jetson Nano Developer Kit

## Getting Started With Jetson Nano Developer Kit(OS Install)
可透過官方提供的 Jetson Nano Developer Kit image 進行作業系統安裝
安裝 Image: [Getting Started With Jetson Nano Developer Kit
](https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write)
**Windows**
1. 下載 [SD Memory Card Formatter for Windows](https://www.sdcard.org/downloads/formatter/eula_windows/) 將 SD 卡格式化
2. 下載 [Etcher](https://www.balena.io/etcher/) 將 image 寫入 SD 卡
**Mac**
* GUI 方式
下載 [Etcher](https://www.balena.io/etcher/) 將 image 寫入 SD 卡
* Comannd Line 方式
確認 Mac 的外接硬碟
```bash
$ diskutil list external | fgrep '/dev/disk'
```
刪除 SD 卡上現有磁區,並允許寫入
```bash
$ sudo diskutil partitionDisk /dev/disk<n> 1 GPT "Free Space" "%noformat%" 100%
```
將壓縮的 image 寫入 SD 卡,注意使用 /dev/rdisk 取代 /dev/disk
```bash
$ /usr/bin/unzip -p ~/Downloads/jetson_nano_devkit_sd_card.zip | sudo /bin/dd of=/dev/rdisk<n> bs=1m
```
完成後依照提示取出 SD 卡
**Linux**
* GUI
下載 [Etcher](https://www.balena.io/etcher/) 將 image 寫入 SD 卡
* Command Line
確認 SD 位置
```bash
$ dmesg | tail | awk '$3 == "sd" {print}'
```
將壓縮的 image 寫入 SD 卡
```bash
$ /usr/bin/unzip -p ~/Downloads/jetson_nano_devkit_sd_card.zip | sudo /bin/dd of=/dev/sd<x> bs=1M status=progress
```
取出 SD 卡
```bash
$ sudo eject /dev/sd<x>
```
完成後開機進行作業系統安裝
**作業系統畫面**

## Environment Quick Reference
為部署深度學習環境,需預先安裝套件,此步驟為快速部署 command
```bash
$ sudo apt-get update
$ sudo apt-get install git cmake libpython3-dev python3-numpy
$ git clone --recursive https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ mkdir build
$ cd build
$ cmake ../
$ make
$ sudo make install
$ sudo ldconfig
```
### Downloading Models
透過 <font style="color:blue">download-models.sh</font> 挑選需要的訓練網路模組進行安裝,預設包含 GoogleNet, ResNet-18, etc,.
>若已透過上述快速部署 command,當中 cmake 會自動執行此步驟,可跳過此步驟
```bash
$ cd jetson-inference/tools
$ ./download-models.sh
```

### Installing PyTorch
建議使用 python 3 比較沒有問題
>若已透過上述快速部署 command,當中 cmake 會自動執行此步驟,可跳過此步驟
```bash
$ cd jetson-inference/build
$ ./install-pytorch.sh
```

### Compiling the Project
透過 make 進行編譯以建立環境
```bash
$ cd jetson-inference/build # omit if working directory is already build/ from above
$ make
$ sudo make install
$ sudo ldconfig
```
### Directory structure
完成編譯後於 build 底下的路徑結構
lib: library
include: headers
bin: sample binaries
networks: 網路模型
images: 測試圖片
```graphviz
digraph hierarchy{
nodesep=1.0
node[color=red, shape=box]
edge[color=blue]
build->{aarch64}
aarch64->{bin include lib}
bin->{networks images}
}
```
## Classifying Images with ImageNet
透過深度學習網路進行圖像識別,深度學習網路類型多樣,包括識別、偵測與語意分割。透過 imageNet 工具可識別影像,提供了 C++ 與 Python 兩種
* imagenet-console.cpp
* imagenet-console.py
工具路徑
```bash
$ cd jetson-inference/buil/aarch64/bin/
```
使用方法
1. 選擇使用的工具
2. 選擇網路模型
3. 欲識別之圖片之路徑與檔名
4. 輸出圖片之路徑與檔名
```bash
$ 工具 網路模型 欲識別圖片 輸出圖片
```
網路模型為選用選項,可以不選網路模型
C++
```bash
$ ./imagenet-console --network=googlenet images/orange_0.jpg output_0.jpg
```
Python
```bash
$ ./imagenet-console.py --network=googlenet images/orange_0.jpg output_0.jpg
```
### Using The Console Program on Jetson
C++ 影像分類程式
```bash
$ ./imagenet-console --network=googlenet images/orange_0.jpg output_0.jpg
```
Python 影像分類程式
```bash
$ ./imagenet-console.py --network=googlenet images/orange_0.jpg output_0.jpg
```

使用其他分類模型
C++
```bash=
$ ./imagenet-console --network=resnet-18 images/jellyfish.jpg output_jellyfish.jpg
```
Python
```bash
$ ./imagenet-console.py --network=resnet-18 images/jellyfish.jpg output_jellyfish.jpg
```

C++
```bash
$ ./imagenet-console --network=resnet-18 images/stingray.jpg output_stingray.jpg
```
Python
```bash
$ ./imagenet-console.py --network=resnet-18 images/stingray.jpg output_stingray.jpg
```

C++
```bash
$ ./imagenet-console.py --network=resnet-18 images/coral.jpg output_coral.jpg
```
Python
```bash
$ ./imagenet-console.py --network=resnet-18 images/coral.jpg output_coral.jpg
```

### Coding Your Own Image Recognition Program(C++)
**以 C++ 程式語言建立影像識別環境**
```bash
$ mkdir ~/my-recognition
$ cd ~/my-recognition
$ touch my-recognition.cpp
$ touch 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
```
使用 C++ 語言撰寫影像識別程式與 cmake 編譯程式
C++ 影像識別程式
```cpp=
/*
* Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
// include imageNet header for image recognition
#include <jetson-inference/imageNet.h>
// include loadImage header for loading images
#include <jetson-utils/loadImage.h>
// 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::RESNET_18 to load ResNet-18 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;
}
```
CMake 編譯程式
```cmake=
# 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 is required
find_package(CUDA)
# 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)
```
建立環境
```bash
$ cd ~/my-recognition
$ cmake.
$ make
```
執行程式
```bash
$ ./my-recognition polar_bear.jpg
image is recognized as 'ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus' (class #296) with 99.999878% confidence
```
### Coding Your Own Image Recognition Program(Python)
以 Python 程式語言建立影像識別環境
```bash
$ cd ~/
$ mkdir my-recognition-python
$ cd my-recognition-python
$ touch my-recognition.py
$ chmod +x my-recognition.py
$ 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
```
使用 Python 程式語言撰寫影像識別程式
Python影像識別程式
```python=
#!/usr/bin/python
import jetson.inference
import jetson.utils
import argparse
# parse the command line
parser = argparse.ArgumentParser()
parser.add_argument("filename", type=str, help="filename of the image to process")
parser.add_argument("--network", type=str, default="googlenet", help="model to use, can be: googlenet, resnet-18, ect. (see --help for others)")
opt = parser.parse_args()
# load an image (into shared CPU/GPU memory)
img, width, height = jetson.utils.loadImageRGBA(opt.filename)
# load the recognition network
net = jetson.inference.imageNet(opt.network)
# classify the image
class_idx, confidence = net.Classify(img, width, height)
# find the object description
class_desc = net.GetClassDesc(class_idx)
# print out the result
print("image is recognized as '{:s}' (class #{:d}) with {:f}% confidence".format(class_desc, class_idx, confidence * 100))
```
執行程式
```bash
$ ./my-recognition.py polar_bear.jpg
image is recognized as 'ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus' (class #296) with 99.999878% confidence
```
## Locating Objects with DetectNet
使用 detectnet-console 工具識別,輸入圖片欲識別圖片,輸出識別邊界、座標與信賴區間,預設使用檢測模型為 91-class SSD-Mobilenet2-v2。
C++ 影響檢測程式
```bash
$ ./detectnet-console --network=ssd-mobilenet-v2 images/peds_0.jpg output.jpg
```
Python 影響檢測程式
```bash
$ ./detectnet-console.py --network=ssd-mobilenet-v2 images/peds_0.jpg output.jpg
```

>
C++ 影響檢測程式
```bash
$ ./detectnet-console images/peds_1.jpg output.jpg
```
Python 影像檢測程式
```bash
$ ./detectnet-console.py images/peds_1.jpg output.jpg
```

以下為檢測範例,包含各種類型檢測



**可用檢測模型**
| Model | CLI argument | NetworkType enum | Object classes |
| --- | --- | --- | --- | --- |
| SSD-Mobilenet-v1 | ```ssd-mobilenet-v1``` | ```SSD_MOBILENET_V1``` | 91([COCO classes](https://github.com/dusty-nv/jetson-inference/blob/master/data/networks/ssd_coco_labels.txt)) |
| SSD-Mobilenet-v2 | ```ssd-mobilenet-v2``` | ```SSD_MOBILENET_V2``` | 91([COCO classes](https://github.com/dusty-nv/jetson-inference/blob/master/data/networks/ssd_coco_labels.txt)) |
| SSD-Inception-v2 | ```ssd-inception-v2``` | ```SSD_INCEPTION_V2``` | 91([COCO classes](https://github.com/dusty-nv/jetson-inference/blob/master/data/networks/ssd_coco_labels.txt)) |
| DetectNet-COCO-Dog | ```coco-dog``` | ```COCO_DOG``` | dogs |
| DetectNet-COCO-Bottle | ```coco-bottle``` | ```COCO_BOTTLE``` | bottles |
| DetectNet-COCO-Chair | ```coco-chair``` | ```COCO_CHAIR``` | chairs |
| DetectNet-COCO-Airplane | ```coco-airplane``` | ```COCO_AIRPLANE``` | airplanes |
| ped-100 | ```pednet``` | ```PEDNET``` | pedestrians |
| multiped-500 | ```multiped``` | ```PEDNET_MULTI``` | pedestrians, luggage |
| facenet-120 | ```facenet``` | ```FACENET``` | faces |
>如欲下載額外模型,可使用 Model Downloader 工具
```bash
$ cd jetson-inference/tools
./download-models.sh
```
## Semantic Segmentation with SegNet
可透過深度學習進行語義分割(Semantic segmentation),分類為 pixel 級別,非整張影像。其透過 Full Convolutional Network(FCN) 完成。
下表為可下載之預訓練語義斷詞模型(pre-train semantic segmantation model)
| 資料集(Data set) | 解析度(Resolution) | CLI 參數(CLI Argument) | 準確性(Accuracy) | Jetson Nano | Jetson Xavier |
| --- | --- | --- | --- | --- | --- |
| [CityScapes](https://www.cityscapes-dataset.com) | 512x256 | ```fcn-resnet18-cityscapes-512x256``` | 83.3% | 48 FPS | 480 FPS |
| [CityScapes](https://www.cityscapes-dataset.com) | 1024x512 | ```fcn-resnet18-cityscapes-1024x512``` | 87.3% | 12 FPS | 175 FPS |
| [CityScapes](https://www.cityscapes-dataset.com) | 2048x1024 | ```fcn-resnet18-cityscapes-2048x1024``` | 89.6% | 3 FPS | 47 FPS |
| [DeepScene](http://deepscene.cs.uni-freiburg.de) | 576x320 | ```fcn-resnet18-deepscene-576x320``` | 96.4% | 26 FPS | 360 FPS |
| [DeepScene](http://deepscene.cs.uni-freiburg.de) | 864x480 | ```fcn-resnet18-deepscene-864x480``` | 96.9% | 14 FPS | 190 FPS |
| [Multi-Human](https://lv-mhp.github.io) | 512x320 | ```fcn-resnet18-mhp-512x320``` | 86.5% | 34 FPS | 370 FPS |
| [Multi-Human](https://lv-mhp.github.io) | 640x360 | ```fcn-resnet18-mhp-640x360``` | 87.1% | 23 FPS | 325 FPS |
| [Pascal VOC](http://host.robots.ox.ac.uk/pascal/VOC/) | 320x320 | ```fcn-resnet18-voc-320x320``` | 85.9% | 45 FPS | 508 FPS |
| [Pascal VOC](http://host.robots.ox.ac.uk/pascal/VOC/) | 512x320 | ```fcn-resnet18-voc-512x320``` | 88.5% | 34 FPS | 375 FPS |
| [SUN RGB-D](http://rgbd.cs.princeton.edu) | 512x400 | ```fcn-resnet18-sun-512x400``` | 64.3% | 28 FPS | 340 FPS |
| [SUN RGB-D](http://rgbd.cs.princeton.edu) | 640x512 | ```fcn-resnet18-sun-640x512``` | 65.1% | 17 FPS | 224 FPS |
### Segmenting Images from the Command Line
C++ 影像語義分割
```bash
$ ./segnet-console --network=fcn-resnet18-cityscapes images/city_0.jpg output.jpg
```
Python 影像語義分割
```bash
$ ./segnet-console.py --network=fcn-resnet18-cityscapes images/city_0.jpg output.jpg
```



:::warning
上述語法無挑選解析度,因此預設皆使用最低解析之網路模組。
:::
Cityscapes 分類與顏色
| Classes | RGB | Colors |
| :---: | :---: | :---: |
| void | 0 0 0 | <font style="color: rgb(0, 0, 0)">void</font> |
| ego_vehicle | 128 64 128 180 | <font style="color: rgb(128, 64, 128)">ego_vehicle</font> |
| ground | 81 0 81 | <font style="color: rgb(81, 0, 81)">ground</font> |
| road | 128 64 128 180 | <font style="color: rgb(128, 64, 128)">road</font> |
| sidewalk | 150 75 200 | <font style="color: rgb(150, 75, 200)">sidewalk</font> |
| building | 70 70 70 | <font style="color: rgb(102, 102, 156)">building</font> |
| wall | 102 102 156 | <font style="color: rgb(190, 153, 153)">wall</font> |
| fence | 190 153 153 | <font style="color: rgb(190, 153, 153)">fence</font> |
| pole | 153 153 153 150 | <font style="color: rgb(153, 153, 153)">pole</font> |
| traffic_light | 250 170 30 | <font style="color: rgb(250, 170, 30)">traffic_light</font> |
| traffic_sign | 250 170 30 | <font style="color: rgb(250, 170, 30)">traffic_sign</font> |
| vegetation | 107 142 35 | <font style="color: rgb(107, 142, 35)">vegetation</font> |
| terrain | 152 251 152 | <font style="color: rgb(152, 251, 152)">terrain</font> |
| sky | 70 130 180 254 | <font style="color: rgb(70, 130, 180)">sky</font> |
| person | 220 20 60 | <font style="color: rgb(220, 20, 60)">person</font> |
| car | 0 0 142 | <font style="color: rgb(0, 0, 142)">car</font> |
| truck | 0 0 70 | <font style="color: rgb(0, 0, 70)">truck</font> |
| bus | 0 60 100 | <font style="color: rgb(0, 60, 100)">bus</font> |
| train | 0 80 100 | <font style="color: rgb(0, 80, 100)">train</font> |
| motorcycle | 0 0 230 | <font style="color: rgb(0, 0, 230)">motorcycle</font> |
| bicycle | 119 11 32 | <font style="color: rgb(119, 11, 32)">bicycle</font> |
### Cityscapes
**不同解析度網路模型**
C++ 影像語義分割 512x256
```bash
$ ./segnet-console --network=fcn-resnet18-cityscapes-512x256 images/city_0.jpg output.jpg
```

C++ 影像語義分割 1024x512
```bash
$ ./segnet-console --network=fcn-resnet18-cityscapes-1024x512 images/city_0.jpg output.jpg
```

C++ 影像語義分割 2048x1024
```bash
$ ./segnet-console --network=fcn-resnet18-cityscapes-2048 images/city_0.jpg output.jpg
```

:::warning
FCN-ResNet18-Cityscapes-2048x1024 為非預設安裝之網路模型,因此需額外使用 ~/jetson-inference/tools/download-models.sh 另外下載。
:::
:::danger
此 script 中第 721 行語法錯誤,雖於執行時顯示為下載解析度 2048x1024 之模組但實際執行為找不到 2048x512 模組,導致下載失敗,須將 512 改為 1024 方可下載成功。
:::
### DeepScene
C++
```bash
$ ./segnet-console --network=fcn-resnet18-deepscene images/trail_0.jpg output_overlay.jpg
$ ./segnet-console --network=fcn-resnet18-deepscene --visualize=mask images/trail_0.jpg output_mask.jpg
```
Python
```bash
$ ./segnet-console.py --network=fcn-resnet18-deepscene images/trail_0.jpg output_overlay.jpg
$ ./segnet-console.py --network=fcn-resnet18-deepscene --visualize=mask images/trail_0.jpg output_mask.jpg
```

DeepScene 分類與顏色
| Classes | RGB | Colors |
| :---: | :---: | :---: |
| trail | 200 155 75 180 | <font style="color: rgb(200, 155, 75)">trail</font> |
| grass | 85 210 100 | <font style="color: rgb(85, 210, 100)">grass</font> |
| vegetation | 15 100 20 | <font style="color: rgb(15, 100, 20)">vegetation</font> |
| obstacle | 255 185 0 | <font style="color: rgb (255, 185, 0)">obstacle</font> |
| sky | 0 120 255 150 | <font style="color: rgb(0, 120, 255)">sky</font> |
### Multi-Human Parsing (MHP)
C++
```bash
$ ./segnet-console --network=fcn-resnet18-mhp images/humans_0.jpg output.jpg
```
Python
```bash
$ ./segnet-console.py --network=fcn-resnet18-mhp images/humans_0.jpg output.jpg
```


MHP 分類與顏色
| Classes | RGB | Colors |
| --- | --- | --- |
| background | 0 0 0 | <font style="color: rgb(0, 0, 0)">background</font> |
| hat/helmet/headwear | 139 69 19 | <font style="color: rgb(139, 69, 19)">hat/helmet/headwear</font> |
| face | 222 184 135 | <font style="color: rgb(222, 184, 135)">face</font> |
| hair | 210 105 30 | <font style="color: rgb(210, 105, 30)">hair</font> |
| arm | 255 255 0 | <font style="color: rgb(255, 255, 0)">arm</font> |
| hand | 255 165 0 | <font style="color: rgb(255, 165, 0)">hand</font> |
| shirt | 0 255 0 | <font style="color: rgb(0, 255, 0)">shirt</font> |
| jacket/coat | 60 179 113 | <font style="color: rgb(60, 179, 133)">jacket/coat</font> |
| dress/robe | 107 142 35 | <font style="color: rgb(107, 142, 35)">dress/robe</font> |
| bikini/bra | 255 0 0 | <font style="color: rgb(255, 0, 0)">bikini/bra</font> |
| torso_skin | 245 222 179 | <font style="color: rgb(245, 222, 179)">torso_skin</font> |
| pants | 0 0 255 | <font style="color: rgb(0, 0, 255)">pants</font> |
| shorts | 0 255 255 | <font style="color: rgb(0, 255, 255)">shorts</font> |
| socks/stockings | 238 130 238 | <font style="color: rgb(238, 130, 238)">socks/stockings</font> |
| shoe/boot | 128 0 128 | <font style="color: rgb(128, 0, 128)">shoe/boot</font> |
| leg | 255 0 0 | <font style="color: rgb(255, 0, 0)">leg</font> |
| foot | 255 0 255 | <font style="color: rgb(255, 0, 255)">foot</font> |
| backpack/purse/bag | 128 128 128 | <font style="color: rgb(128, 128, 128)">backpack/purse/bag</font> |
| sunglasses/eyewear | 192 192 192 | <font style="color: rgb(192, 192, 192)">sunglasses/eyewear</font> |
| other_accessory | 128 128 128 | <font style="color: rgb(128, 128, 128)">other_accessory</font> |
| other_item | 128 128 128 | <font style="color: rgb(128, 128, 128)">other_item</font> |
### Pascal VOC
C++
```bash
$ ./segnet-console --network=fcn-resnet18-voc images/object_0.jpg output.jpg
```
Python
```bash
$ ./segnet-console.py --network=fcn-resnet18-voc images/object_0.jpg output.jpg
```



VOC 分類與顏色
| Classes | RGB | Colors |
| --- | ---| --- |
| background | 0 0 0 | <font style="color: rgb(0, 0, 0)">background</font> |
| aeroplane | 255 0 0 | <font style="color: rgb(255, 0, 0)">aeroplane</font> |
| bicycle | 0 255 0 | <font style="color: rgb(0, 255, 0)">bicycle</font> |
| bird | 0 255 120 | <font style="color: rgb(0, 255, 120)">bird</font> |
| boat | 0 0 255 | <font style="color: rgb(0, 0, 255)">boat</font> |
| bottle | 255 0 255 | <font style="color: rgb(255, 0, 255)">bottle</font> |
| bus | 70 70 70 220 | <font style="color: rgb(70, 70, 70)">bus</font> |
| car | 102 102 156 | <font style="color: rgb(102, 102, 156)">car</font> |
| cat | 190 153 153 | <font style="color: rgb(190, 153, 153)">cat</font> |
| chair | 180 165 180 | <font style="color: rgb(180, 165, 180)">chair</font> |
| cow | 150 100 100 | <font style="color: rgb(150, 100, 100)">cow</font> |
| diningtable | 153 153 153 150 | <font style="color: rgb(153, 153, 153)">diningtable</font> |
| dog | 250 170 30 | <font style="color: rgb(250, 170, 30)">dog</font> |
| horse | 220 220 0 | <font style="colorf: rgb(220, 220, 0)">horse</font> |
| motorbike | 107 142 35 | <font style="color: rgb(107, 142, 35)">motorbike</font> |
| person | 192 128 128 | <font style="color: rgb(192, 128, 128)">person</font> |
| pottedplant | 70 130 180 254 | <font style="color:rgb (70, 130, 180)">pottedplant</font> |
| sheep | 220 20 60 | <font style="color: rgb(220, 20, 60)">sheep</font> |
| sofa | 0 0 142 | <font style="color: rgb(0, 0, 142)">sofa</font> |
| train | 0 0 70 | <font style="color: rgb(0, 0, 70)">train</font> |
| tvmonitor | 119 11 32 | <font style="color: rgb(119, 11, 32)">tvmonitor</font> |
### SUN RGB-D
C++
```bash
$ ./segnet-console --network=fcn-resnet18-sun images/room_0.jpg output.jpg
```
Python
```bash
$ ./segnet-console.py --network=fcn-resnet18-sun images/room_0.jpg output.jpg
```



SUN 分類與顏色
| Classes | RGB | Colors|
| --- | --- | --- |
| other | 0 0 0 | <font style="color: rgb(0, 0, 0)">other</font> |
| wall | 128 0 0 | <font style="color: rgb(128, 0, 0)">wall</font> |
| floor | 0 128 0 | <font style="color: rgb(0, 128, 0)">floor</font> |
| cabinet/shelves/bookshelf/dresser | 128 128 0 | <font style="color: rgb(128, 128,0)">cabinet/shelves/bookshelf/dresser</font> |
| bed/pillow | 0 0 128 | <font style="color: rgb(0, 0, 128)">bed/pillow</font> |
| chair | 128 0 128 | <font style="color: rgb(128, 0, 128)">chair</font> |
| sofa | 0 128 128 | <font style="color: rgb(0, 128, 128)">sofa</font> |
| table | 128 128 128 | <font style="color: rgb(128, 128, 128)">table</font> |
| door | 64 0 0 | <font style="color: rgb(64, 0, 0)">door</font> |
| window | 192 0 0 | <font style="color: rgb(192, 0, 0)">window</font> |
| picture/tv/mirror | 192 128 0 | <font style="color: rgb(192, 128, 0)">picture/tv/mirro</font> |
| blinds/curtain | 192 0 128 | <font style="color: rgb(192, 0, 128)">blinds/curtain</font> |
| clothes | 128 64 128 | <font style="color: rgb(128, 64, 128)">clothes</font> |
| ceiling | 0 192 128 | <font style="color: rgb(0, 192, 128)">ceiling</font> |
| books | 128 192 128 | <font style="color: rgb(128, 192, 128)">books</font> |
| fridge | 64 64 0 | <font style="color: rgb(64, 64, 0)">fridge</font> |
| person | 192 192 128 | <font style="color: rgb(192, 192, 128)">person</font> |
| toilet | 128 0 64 | <font style="color: rgb(128, 0, 64)">toilet</font> |
| sink | 0 128 64 | <font style="color: rgb(0, 128, 64)">sink</font> |
| lamp | 128 128 64 | <font style="color: rgb(128,128, 64)">lamp</font> |
| bathtub | 0 0 192 | <font style="color: rgb(0, 0, 192)">bathtub</font> |
### Processing a Directory of Images
這邊提供了 Python 的腳本 ```segnet-batch.py``` 以批次處理整個資料夾的影像
```bash
$ ./segnet-batch.py --network=<網路模型> <影像輸入路徑> <影像輸出路徑>
```
## Transfer Learning with PyTorch
此技術用於重新訓練 DNN 模型,可花費較少的時間。此範例以 Resnet-18 為範例,亦可使用其他網路模型>
### 安裝 PyTorch
```bash
$ cd ~/jetson-inference/build
$ ./install-pytorch.sh
```
### 確認 PyTorch
```bash
$ python
```
或
```bash
$ python3
```
```bash
>>> import torch
>>> print(torch.__version__)
>>> print('CUDA available: ' + str(torch.cuda.is_available()))
>>> a = torch.cuda.FloatTensor(2).zero_()
>>> print('Tensor a = ' + str(a))
>>> b = torch.randn(2).cuda()
>>> print('Tensor b = ' + str(b))
>>> c = a + b
>>> print('Tensor c = ' + str(c))
```

```bash
>>> import torchvision
>>> print(torchvision.__version__)
```
其中 torch 版本應為 1.1.0 , torchvision 版本應為 0.3.0
### Mounting Swap
若使用 Jetson Nano ,則應掛載 4GB 的 swap 空間,training 會大量使用。
執行以下指令建立 swap 檔
```bash
$ sudo fallocate -l 4G /mnt/4GB.swap
$ sudo mkswap /mnt/4GB.swap
$ sudo swapon /mnt/4GB.swap
```
將下列這行加入 /etc/fstab
```
/mnt/4GB.swap none swap sw 0 0
```
### 訓練資料集
## What is Deep Learning?
### 介紹
一般深度學習共分為兩個開發階段:訓練(**training**)與推理(**inference**)。
**Training**
於訓練階段,神經網路會從大量資料集中帶有標記的範例學習,神經網路的權重將優化以識別資料集中的行為模式。深度神經網路擁多層神經元互相連結,更深的網路需花更多時間訓練與評估。

訓練過程相當耗資源,於傳統運算架構上虛耗費數週或數月,使用GPU可加速該過程至數數天或數小時。
**DIGITS**
DIGITS 為 NVIDIA 開源計畫,可使用 GPU 加速交互訓練網路。
[DIGITS](https://github.com/NVIDIA/DIGITS)

**Inference**
透過訓練過的權重,神經網路可於運行時即時評估資料,神經網路基於訓練資料學習進行預測與應用稱之為推理,可以有多方應用,包括
* 影像辨識 Image recognition
* 物體檢測 Object detection
* 分割 Segmentation
* 影像定位(單應性估算)Image registration(homography estimation)
* 訊號分析Signal analytics
## DIGITS workflow
透過 NVIDIA 深度學習工具訓練 DNNs 與高效部署
## Reference
[Hello AI World — Meet Jetson Nano](https://youtu.be/9gVupqHqJws)
###### tags: `nvidia` `jetson`