嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

在NVIDIA Jetson nano 上执行深度学习范例:影像辨识、物件侦测、影像分割

作者 郭俊廷/蔡雨錡
難度 中等
所需時間 2小時

一、深度学习介绍

深度学习是机器学习的一种,机器学习是让机器可以自我学习,透过将数据处理让机器有人工智能。而深度学习就是是机器学习的一种方式,它可以让计算机像神经网络一样,进行复杂的运算,运用各种算法运算呈现出像人一样的判断或行为,例如之前很红的AlphaGo打败围棋冠军、照片人脸侦测标记等等应用都是深度学习的应用。

以下就是我们使用Jetson nano执行jetson-inference范例的画面截图

0118_c730aa82d4fc81300842856b3acfee307054b5d1.jpg

二、jetson-inference相关软件安装

我们使用NVIDIA提供的jetson-inference范例,其中包含了影像辨识 (Image Recognition)、物件侦测 (Object Detection)、以及影像分割 (Segmentation)。它是使用TensorRT来将神经网络部属到Jetson nano上。jetson-inference它可以使用C++ 或 Python来跑我们的范例,以下我们都使用Python来介绍。

0217_4a01bc9b792d20e4612c76fcc5e964fb02973f03.jpg

我们使用之前文章所使用的官方提供的映像文件来安装此jetson-inference范例的相关软件。

我们使用之前介绍过的MobaXterm来远程联机安装相关软件

Step1 输入以下指令取得远程更新服务器的套件档案列表(此指令需要输入用户密码请输入你设定的密码,如果是按照之前教学皆设定为jetsonnano)

 sudo apt-get update

0315_360c1e67789c3577445e20629691f73e74c6c522.jpg

Step2 输入以下指令安装git、cmake套件、Python 3.6开发包(如果已经安装过会显示已安装)。

sudo apt-get install git cmake libpython3-dev python3-numpy

0416_7d44ae88d8118ce6ff9e690d3b8a1b8e1978717f.jpg

Step3  使用git下载jetson-inference项目程序

git clone --recursive https://github.com/dusty-nv/jetson-inference

0510_343eb5e67ed8fbdd85dcca9297a2a3b7efca274a.jpg

Step4 移动到jetson-inference文件夹

cd jetson-inference

069_48ab0649d88fb245dc4af2d0cf98711b569530a3.jpg

Step5  创建build文件夹并移动到该文件夹

mkdir build
cd build

077_5615496e556bdbf223bc7485eb4cb0a8a105c7ff.jpg

Step6 接着使用CMake来准备编译所需的相依套件

cmake ../

编译到一半时会问你要下载甚么模型,以下是TensorRT有支持的模型,如果选择全部档案下载需要一些时间,可以根据你需要的模型选择下载或是使用下面默认的模型来下载。

087_ac9d8451a7cb46f96348548dfce97ddec7ca1434.jpg

选择需要下载的模型

097_5a8e50ce8749d6db2ba47a0e5f8bc4c2517b2340.jpg

下载的过程

下载完模型后会询问另外一个是否下载Python的PyTorch软件包,这里我们选择安装Python 3.6的PyTorch软件包版本。

1032_a61a556056a65a6c6da466248cd095ad3ce4f609.jpg

Step7  使用make编译程序代码

make -j$(nproc)

1142_4e425928a4a24ca999ed0037da7e0c835de44901.jpg

编译中

1234_ed20c6b65f3c3dcb388838c0c960683c4ceac762.jpg

编译完成

Step8 执行sudo make install

最后完整的输出档案将会在 jetson-inference/build/aarch64 这个文件夹中, 接下来所有要执行的范例程序都存放在 jetson-inference/build/aarch64/bin 文件夹中。

1332_193b2649228e925fd06cbec3b287e62bccfbdc76.jpg

安裝中

1428_36725fa3962869a0f799bfda692aa5a729f28415.jpg

安装成功时可以看到bin底下有要执行的范例程序

三、影像辨识 (Image Recognition)

范例分成可以应用在静态影像上(Images)或是摄影镜头的串流影像上(Camera)的辨识。

Step1 我们先将工作目录移到以下范例文件夹中

cd ~/jetson-inference/build/aarch64/bin

首先来辨识静态影像上的范例程序:imagenet-console.py

Step2 呼叫影像辨识范例来辨识NVIDIA提供的影像

NVIDIA提供的影像默认路径是jetson-inference/data/images/

可以看到下面有很多图片可以供你测试使用,也可以使用自己的图片来测试,以下我们使用black_bear.jpg来测试

1527_22e541c8d002fbc557e5bb786f2e2ac05fe23f3b.jpg

NVIDIA提供的影像默认路径

下指令呼叫静态影像辨识程序时格式如下:(影像默认路径如上图)

./imagenet-console 要辨识的影像路径及文件名 辨识影像结果的路径及文件名

执行以下指令来辨识范例中黑熊的图片black_bear.jpg, 然后将辨识完的结果储存为 black_bear_ima.jpg。(辨识完的结果图片储存的目录默认在jetson-inference/build/aarch64/bin里面)

./imagenet-console black_bear.jpg black_bear_ima.jpg

第一次跑的时候,需要等待几分钟,因为TensorRT会花上些许的时间来优化这个网络,之后再次执行程序就会快很多。

1626_3b254b8a6053de6691283491aa3f3c5504b02850.jpg

1726_01bd7e79bf7f527523206a9bf1b8bf1d652a230a.jpg

1826_951948e46c211b182b6bad5d65eda3acaa90ece9.jpg

原图

1924_4bfc60def7cce0ce14ad53f9b37d27fe37e5555c.jpg

辨识结果98%为美洲黑熊、黑熊

Step3 接着是摄影镜头的串流影像上(Camera)的辨识(注意这使用摄影机时的操作画面需要在Jetson nano上接屏幕才可以看到镜头的画面远程联机操作时则无法显示镜头的画面)

在本篇文章中统一使用Logitech 的C270 的USB Camera,所以需要将ca里mera指定为 /dev/video0, 也就是一般USB Camera的默认位置。

执行以下指令来让我们USB摄影机串流影像实时辨识

./imagenet-camera --camera /dev/video0

执行后的结果拿取手边可得的东西来辨识,可以发现辨识成功。

208_6502b35c2be279a92c8f87ef684affce5b4ffc21.jpg

2121_b1f7dd05789f46f2d68cfabe46441159c45acc22.jpg

2221_ea91c2db88250133c1b53975097078729dfd7e00.jpg

四、对象侦测 (Object Detection)

下指令呼叫静态对象侦测程序时格式如下:

范例分成可以应用在静态影像上(Images)或是摄影镜头的串流影像上(Camera)的侦测。

Step1 我们先将工作目录移到以下范例文件夹中

cd ~/jetson-inference/build/aarch64/bin​

Step2 呼叫对象侦测范例来侦测NVIDIA提供的影像

下指令呼叫静态对象侦测程序时格式如下:(影像默认路径跟默认储存目录同上)

./detectnet-console 要侦测的影像路径及文件名 侦测影像结果的路径及文件名

执行以下指令来侦测范例中飞机的图片airplane_0.jpg, 然后将侦测完的结果储存为 airplane_0det.jpg。(侦测完的结果图片储存的目录默认在jetson-inference/build/aarch64/bin里面)

./detectnet-console airplane_0.jpg airplane_0det.jpg​

使用范例图片airplane_0.jpg的侦测结果如下,可以看到侦测出飞机这个对象并把它框起来

Step3 接着是摄影镜头的串流影像上(Camera)的对象侦测

执行以下指令来让我们USB摄影机串流影像进行对象侦测可以看到以下结果

./detectnet-camera --camera /dev/video0​

2421_32e5a251704a72a93c86e03583247bb085e0f06b.jpg

侦测结果可以看到有侦测到键盘、鼠标还有手(人类)

五、影像分割 (Segmentation)

下指令呼叫静态影像分割程序时格式如下:

范例分成可以应用在静态影像上(Images)或是摄影镜头的串流影像上(Camera)的影像分割。

Step1 我们先将工作目录移到以下范例文件夹中

cd ~/jetson-inference/build/aarch64/bin

Step2 呼叫影像分割范例来侦测NVIDIA提供的影像

下指令呼叫静态对象影像分割程序时格式如下:(影像默认路径如上)

./segnet-console 要分割的影像路径及文件名 影像分割结果的路径及文件名

执行以下指令来分割范例中马的图片horse_0.jpg,然后将分割完的结果储存为 horse_0seg.jpg。(分割完的结果图片储存的目录默认在jetson-inference/build/aarch64/bin里面)

./segnet-console horse_0.jpg horse_0seg.jpg

2518_a28d1104ad152c9e6cbd22af2b42030f3ef657ec.jpg

可以看到有分割成马跟人两种颜色

每种颜色所代表的对象如下图

2619_f194eb8c34df074bc43db30afb054e2b809c9ff8.jpg

Step3 接着是摄影镜头的串流影像上(Camera)的影像分割

执行以下指令来让我们USB摄影机串流影像进行影像分割可以看到以下结果

./segnet-camera --camera /dev/video0

2717_18ae2797f2a15d111df46e8564bac7531abe0d64.jpg

分割后看到黄色的是狗 粉红色的是猫

以上就是我们的在Jetson nano上执行Deep Learning深度学习范例的介绍与教学,大家有没有成功的执行影像辨识、对象侦测 、以及影像分割三种范例呢?未来我们将会推出更多丰富的内容,有兴趣欢迎关注我们!

CAVEDU Education is devoted into robotics education and maker movement since 2008, and is intensively active in teaching fundamental knowledge and skills. We had published many books for readers in all ages, topics including Deep Learning, edge computing, App Inventor, IoT and robotics. Please check CAVEDU's website for more information: http://www.cavedu.com, http://www.appinventor.tw