---
# System prepended metadata

title: '**2021/07/14**'
tags: [2021/07/14, 藍柏婷]

---

# **2021/07/14**
[[2 Running the Docker Container]](https://github.com/dusty-nv/jetson-inference/blob/master/docs/aux-docker.md)
[[2.5 Building the Project from Source]](https://github.com/dusty-nv/jetson-inference/blob/master/docs/building-repo-2.md)
[[3 Classifying Images with "ImageNet"]](https://github.com/dusty-nv/jetson-inference/blob/master/docs/imagenet-console-2.md)
[[4 Coding Your Own Image Recognition Program (Python)]](https://github.com/dusty-nv/jetson-inference/blob/master/docs/imagenet-example-python-2.md)
###### tags: `藍柏婷`
###### tags: `2021/07/14`

### **==== 啟動容器 Launching the Container ====**
    
    ＄ git clone --recursive https://github.com/dusty-nv/jetson-inference	
>-> 把 https://github.com/dusty-nv/jetson-inference 克隆(clone)進jetson nano裡

    $ cd jetson-inference  
>-> 進入`jetson-inference`這個file

    $ docker/run.sh 
>*-> 自動根據你現在的JetPack版本去DockerHub抓取對應的容器 (Contrainer)，並且如果你有使用攝影機的話這時候也會自動讀取
-> Docker Container -> 可以想像是一個獨立的虛擬環境，使用者進入容器之後會與你原生系統的檔案區(你的電腦)隔開來，但也是可以透過「掛接」的方式到容器中，像這次如果直接執行run.sh的話，會自動將`jetson-inference/data`掛載到docker的 `/jetson-inference/build/aarch64/bin/` 當中，所以你可以在外部新增或刪除圖片。*

    $ docker/run.sh --volume /my/host/path:/my/container/path 
>-> (我不確定跟上一句差在哪)

---

### **==== 運行應用程序 Running Applications ====**

    # cd build/aarch64/bin
>-> 進入`build`這個資料夾 -> 進入`aarch64`這個資料夾 -> 進入`bin`這個資料夾

    # ./video-viewer /dev/video0
>-> 引進鏡頭

    # ./imagenet  images/jellyfish.jpg  images/test/jellyfish.jpg
>->  在當前目錄 `imagenet` 中，找 `images` 下的 `jellyfish.jpg` 照片當輸入，輸出存成 `images` 下 `test` 下的 `jellyfish.jpg`。

    # ./detectnet  images/peds_0.jpg  images/test/peds_0.jpg
>->  跟上句差不多意思

    # 按 Ctrl+D 退出容器
>->  即退出#的輸入，回歸$的輸入

---

### **==== 構建容器 Building the Container ====**

    $ docker/build.sh
>-> 建立一個 `build.sh` 的資料夾

---

### **==== 從源代碼構建項目 Building the Project from Source ====**
#### **== 不使用docker的構建、安裝命令 Quick Reference ==**

    $ sudo apt-get update 
>-> 更新

    $ sudo apt-get install git cmake libpython3-dev python3-numpy 
>-> 安裝 `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 -j$(nproc)
    $ sudo make install
    $ sudo ldconfig
>-> (這段我不確定有沒有打)

#### **== Python開發包 Python Development Packages ==**

    $ sudo apt-get install libpython3-dev python3-numpy
>-> 綁定(安裝)Python 3.6 開發包

#### **== 使用CMake進行配置 Configuring with CMake ==**

    $ cd jetson-inference   
>-> 進入`jetson-inference`這個資料夾

    $ mkdir build 
>-> 在`jetson-inference`這個資料夾中建立一個新的項目`build`

    $ cd build 
>-> 進入`build`這個資料夾
    
    $ cmake ../ 
>-> python的一種語法，可以自動運作一個工具(?)

#### **== 下載模型 Downloading Models ==**
(CMake會幫你自動跑出一個綠色框框，直接按OK就行)

#### **== 安裝PyTorch(Installing PyTorch) ==**
(安裝3.6版)

#### **== 編譯項目 Compiling the Project ==**

    $ cd jetson-inference/build 
    $ make 
    $ sudo make install 
    $ sudo ldconfig 
>`$ cd jetson-inference/build` -> 進入build資料夾中
`$ make` -> 運行make
`$ sudo make install` -> 安裝make
`$ sudo ldconfig` -> ldconfig是一個動態鏈接庫管理命令，為了讓動態鏈接庫為系統所共享。ldconfig通常在系統啟動時運行,而當用戶安裝了一個新的動態鏈接庫時,就需要手工運行這個命令。
(應用程序就能正確找到make相關鏈接文件了?)

---

### **==== 使用 ImageNet 對圖像進行分類 Classifying Images with ImageNet ====**

    $ cd jetson-inference/build/aarch64/bin 
>-> 先確保現在在`bin`中
    
    $ ./imagenet.py  images/orange_0.jpg  images/test/output_0.jpg 
>`./imagenet.py` -> 在現在的資料中(bin)找 `imagenet.py`
`images/orange_0.jpg` -> 在`images`中找`orange_0.jpg`(範例圖片)
`images/test/output_0.jpg` -> 在`images`中的`test`中放入output的結果`output_0.jpg`(範例輸出)(記得每輸出一次，就要改一次output_的那個數字)

   ** 總之，只有 `orange_0.jpg` & `output_0.jpg` 可以更改 **

---

### **==== 編寫自己的圖像識別程序(Python) ====**
#### **== 設置項目 ==** 
    # run these commands outside of container
    
    $ 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 

    $ docker/run.sh --volume ~/my-recognition-python:/my-recognition-python 
   (先到 `/my-recognition-python`中再輸入) ****更正!!!進入`jetson-inference`再執行

#### **== 源代碼 ==**
在`jetson-inference/python/examples`中會有一個`my-recognition.py`，點開就是以下的程式碼
```python=
#!/usr/bin/python3

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 = jetson.utils.loadImage(opt.filename)	
    
# load the recognition network  
net = jetson.inference.imageNet(opt.network)	

# classify the image 
class_idx, confidence = net.Classify(img)	

# 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))
```    
>```python=3
>import jetson.inference
>```
>-> import相當於c++的include
>
>```python=8
># 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()
>```
>-> 解析命令行
>
>```python=14
># load an image (into shared CPU/GPU memory)
>img = jetson.utils.loadImage(opt.filename)
>```
>-> 從磁盤加載圖像，使用loadImage()的功能將圖像opt.filename加載至共享的 CPU/GPU 內存中。
>
>```python=17
># load the recognition network
>net = jetson.inference.imageNet(opt.network)
>```
>-> 加載識別網絡，使用imageNet()加載opt.network (GoogleNet)
>
>```python=20
># classify the image
>class_idx, confidence = net.Classify(img)
>```
>-> 對圖像進行分類，使用Classify()辨識出類別及信心度
>
>```python=23
># find the object description
>class_desc = net.GetClassDesc(class_idx)
>```
>-> 找到對象描述
>
>```python=26
># print out the result
>print("image is recognized as '{:s}' (class #{:d}) with {:f}% confidence".format(class_desc, class_idx, confidence * 100))
>```
>-> 打印出結果

#### **== 運行示例 ==**

    $ ./my-recognition.py polar_bear.jpg 
   (先到`/build/aarch64/bin`中再輸入) 