独家 | 如何为计算机视觉和深度学习安置英伟达?

2020-06-04 10:50:11 浏览数 (1)

作者:Sangeet Aggarwal

翻译:王晓颖

校对:张若楠

本文约10000字,建议阅读10 分钟

本文教你如何使用 Tensor Flow,Keras,Tensor RT,以及OpenCV来为计算机视觉和深度学习安置你的英伟达Jetson Nano。

标签:计算机视觉,深度学习

之前我们讨论了如何使用我的 pre-configured Nano .img file,那今天,你将学习从头开始想学习如何安置你自己的Nano。

本教程需要你有至少48小时的空余时间完成你英伟达 Jetson Nano 的自主安置(是的,这就是这么有挑战)。

如果你决定想要用我的pre-configured Nano .img file来代替一些繁琐步骤,你可以从我的新书Raspberry Pi for Computer Vision 中找到相关部分。

本篇专为那些有足够有勇气想要正面迎战的你而写!

想要学习如何为计算机视觉和深度学习安置你的英伟达 Jetson Nano,就继续阅读

正文开始

英伟达Jetson Nano 封装了每秒浮点运算为472千兆的计算马力。这是个能力强大的设备,但是配置起来十分复杂(复杂系统一般都不容易安置)。

在本教程中,我们会陆续通过16个步骤来为计算机视觉和深度学习安置你的Jetson Nano。

准备好接受一个漫长而磨人的过程---你可能需要2到5的时间根据本教程来安置你的Nano。

完成安置后,我们将测试你的系统以确认是否安置正确,以及 TensorFlow/Keras和OpenCV能否按照预期运行。我们还将用OpenCV来测试Nano摄像头确认我们可以访问视频流。

如果你在最后一个测试阶段遇到了问题,那你需要返回之前的步骤来解决它;甚至,你可能要冲头开始,用另外的充满痛苦2到5天的时间弄懂教程再继续(别担心,我在16个步骤后面还提供了备选方案)。

第一步#1:将英伟达的Jetson Nano Developer Kit.img闪存到Jetson Nano的microSD卡中

在这一步骤中,我们要下载 NVIDIA’s Jetpack 4.2 Ubuntu-based OS image并将它闪存到一个microSD卡中。你会需要一个 已闪存的microSD并准备好根据以下步骤继续:

直接点击并在该链接(https://developer.nvidia.com/jetpack-4_2)下载,确认你下载的是下面图中所示‘Jetson Nano Developer Kit SD Card image’。

我们建议Jetpack 4.2,它在计算机视觉化中能更好适配整个树莓派(Raspberry Pi)功能包(我们的建议在未来会有改变)。

当你在等待Nano SD图片下载的间歇中,可以继续下载并安置balenaEtcher,一个磁盘图片闪存工具:

图2:为你的OS下载并安置belenaEtcher。你将用它来把Nano 图片闪存到一个microSD卡

一旦NanoJetpack图片和belenaEtcher都下载安置后,就准备好将闪存图片到microSD。

你需要一套合适的microSD卡和microSD读取硬盘。我们推荐32GB或者64GB的microSD (SanDisk 的98MB/s卡品质优越,亚马逊有售)。任何microSD卡读取器都可以运行。

插入microSD到读卡器中,然后将读卡器接入你电脑上的USB接口。从这步起,启动balenaEtcher并继续至下一步Flash按钮。

图3:闪存英伟达的Jetpack 图片和balenaEtcher到一个microSD 卡是安置Nano 的第一步

当闪存完成,就可以进行第二步了。

第二步#2:用microSD启动你的Jetson Nano 并连接网络

图4:英伟达 Jetson Nano自身不兼备Wi-Fi ,但你可以用一个USB的无线模组(右上)或者在散热片下一个更永久性的模组(底部中间)。图中还有一个5伏特4安培(20瓦)充电头(左上),你可以在连接很多硬件时给Jetson Nano 充电。

在这一步,我们要给Jetson Nano通电并建立网络连接。

这个步骤需要如下准备:

  1. 第一步中闪存好的microSD;
  2. 一个英伟达的Jetson Nano dev板;
  3. HDMI 屏幕;
  4. USB的键盘和鼠标;
  5. 充电头:yi5伏特 2.5安培(12.5瓦)的microSD充电头或者5伏特 4 安培(20瓦)的有J48接头处跨接导线的套管电源;
  6. 网络连接:连接Nano到你网络的以太网网线后者无线模组。无线模组可以是USB的Wi-Fi转接器或者在Jetson Nano散热片下安置的Wi-Fi模组。

如果你想用Wi-Fi(大部分人的选择)你一定要装一个自己的Wi-Fi模组。 有以下两个特别棒的选择来给你的Jetson Nano添加Wi-Fi:

  1. USB转Wi-Fi 转换器(图4右上)。不需要任何工具包而且可适用于其他设备。如图中的 Geekworm 双频USB 1200米线(Geekworm Dual Band USB 1200m。
  2. 类似于Intel双频Wi-Fi模组(Intel Dual Band Wireless-Ac 8265 W/Bt (Intel 8265NGW))和 两个 Molex Flex 2042811100 Flex Antennas (图5,底部中间)。你必须在Jetson Nano 的主要散热片下安置Wi-Fi模组和天线。这个改装需要一个飞利浦 #2改锥、无线模组和天线(更别说耗费10-20分钟的操作时间)。

如果你想让Jetson Nano 连接Wi-Fi,我们建议你采用USB的Wi-Fi转换器。 网络上还有很多选择,所以也可以买一个有Ubuntu 18.04 的驱动提前安置到OS上,这样你就不需要费劲按照Geekworm的产品说明来下载安置驱动(如果你原本就没有可用的有线连接那么下载和安置驱动对你来说会很难)。

一旦你已收集所有装备,把你的microSD卡像图5所示插入你的Jetson Nano:

图5:插入闪存好Jetpack的microSD卡需要先找到microSD接口,即如图中红圈所示位置。插入microSD卡一直到正确位置

现在,连接你的屏幕,键盘,鼠标和网络交互。

最后,充电。将你Jetson Nano的充电转换器插入充电头(用J48跨接如果你是用的20瓦套管充电头)。

图6:用你屏幕中靠近右上角的图标来安置Jetson Nano的网络设置,你会需要网络访问来下载和安置用于计算机视觉和深度学习的软件

一旦你看到了NVIDIA Ubuntu 18.04的桌面,你可以按需要用图六中显示的菜单栏上的图标来安置你的有线或者无线网络设置。

当你确认你的英伟达 Jetson Nano已经有了网络访问,你可以进行下一步。

第三步#3:打开一个终端或者开启一个SSH session

在这个步骤,我们可以做以下选项中的一个:

  1. 选项1:在Nano桌面打开一个终端,假定此后的步骤都需要用到已连接到你的Nano键盘和鼠标。
  2. 选项2:从另一台电脑上启动一个SSH 连接,这样我们可以远程为计算机视觉和深度学习来配置Jetson Nano。

两个选项一样可行。

  • 选项1:在Nano桌面打开一个终端

对于选项1, 打开一个软件启动台,选择一个终端软件。你可能希望在左侧的菜单上右击并锁定这个软件到启动台,毕竟你很大可能需要经常使用到它。

你现在可以继续第四步#4 并将终端一直开着以便输入指令。

  • 选项2:从另一台电脑上启动一个SSH 连接

对于选项2,你必须决定你的Jetson Nano的用户名和IP地址。在你的Nano上,从软件启动台准备好一个终端,并且在提示下输入下面的指令:

代码语言:javascript复制
$ whoami
nvidia
$ ifconfig
en0: flags=8863 mtu 1500
  options=400
  ether 8c:85:90:4f:b4:41
  inet6 fe80::14d6:a9f6:15f8:401%en0 prefixlen 64 secured scopeid 0x8
  inet6 2600:100f:b0de:1c32:4f6:6dc0:6b95:12 prefixlen 64 autoconf secured
  inet6 2600:100f:b0de:1c32:a7:4e69:5322:7173 prefixlen 64 autoconf temporary
  inet 192.168.1.4 netmask 0xffffff00 broadcast 192.168.1.255
  nd6 options=201
  media: autoselect
  status: active

抓取你的IP地址(高亮的那一行)。我的IP地址是 192.168.1.4;然而你的IP地址与我不同,所以确保你检查并确认你的IP地址。

然后,在其他电脑上,比如你的笔记本/台式机,按如下开启一个SSH连接:

代码语言:javascript复制
$ ssh nvidia@192.168.1.4

注意我在Jetson nano上的指令里是如何输入用户名和我的IP地址来达到远程连接的。你现在应该成功连接到你的Jetson Nano,并且可以继续第四步了。

第四步#4:更新你的系统并且删除程序以节省空间

在这一步,我嗯要删除一些我们不需要的程序,并且更新我们的系统。

第一步,我们先设置Nano使用最大功率容量:

代码语言:javascript复制
$ sudo nvpmodel -m 0
$ sudo jetson_clocks

Nvpmodel指令控制着2种Jetson Nano功率选项:第一种是5瓦的模式1,以及第二种是10瓦的模式0。默认的是更高的瓦特模式,但是每次在跑 jetson_clocks指令前最好强调一下模式。

根据英伟达 devtalk 论坛:

“jetson_clocks脚本禁用 DVFS调控器,并且由激活的nvpmodel电源模式去锁定时钟为它们可被设定的最大值。所以如果你的激活模式是10瓦,jetson_clocks会按10瓦模式去锁定时钟最大值,若你的激活模式是5瓦,jetson_clocks会按5瓦模式去锁定时钟最大值。”

注意:有两种典型的方法来给你的Jetson Nano 。一个5伏特2.5安培(10瓦)的microUSB 电源转换器是一个好的选择。如果你有很多装备是由Nano驱动的(键盘,麦克风,Wi-Fi,摄像头)那么你需要考虑一个5伏特4安培(20瓦)的充电头来确保你的处理器们在供电其他装备时也可以按照他们的全速运行。理论上讲还有第三种供电方式,如果你愿意可以从排针直接供电。

当你设置了Nano 的最大功率后,直接删掉LibreOffice—它占了大部分空间而且我们在计算机视觉和深度学习方面完全用不到它:

代码语言:javascript复制
$ sudo apt-get purge libreoffice*
$ sudo apt-get clean

接着,我们可以继续升级系统包:

代码语言:javascript复制
$ sudo apt-get update && sudo apt-get upgrade

在下一步中,我们将开始安装软件。

第五步#5:安装系统级Cython库

第一个软件组我们需要安装的包括一系列开发工具:

代码语言:javascript复制
$ sudo apt-get install git cmake
$ sudo apt-get install libatlas-base-dev gfortran
$ sudo apt-get install libhdf5-serial-dev hdf5-tools
$ sudo apt-get install python3-dev
$ sudo apt-get install nano locate

接着,我们安装SciPy 底层软件和一个系统级 Cython 库:

代码语言:javascript复制
$ sudo apt-get install libfreetype6-dev python3-setuptools
$ sudo apt-get install protobuf-compiler libprotobuf-dev openssl
$ sudo apt-get install libssl-dev libcurl4-openssl-dev
$ sudo apt-get install cython3

我们还需要一些用来使用TensorFlow对象检测(TFOD)API项目的XML 工具:

代码语言:javascript复制
$ sudo apt-get install libxml2-dev libxslt1-dev

第六步#6:更新 CMake

现在我们将更新 CMaker 预编工具(precompiler tool)因为我们需要一个更新的版本来成功编写OpenCV。

首先,下载并提取CMake更新:

代码语言:javascript复制
$ wget http://www.cmake.org/files/v3.13/cmake-3.13.0.tar.gz
$ tar xpvf cmake-3.13.0.tar.gz cmake-3.13.0/

接着,编写CMake:

代码语言:javascript复制
$ cd cmake-3.13.0/
$ ./bootstrap --system-curl
$ make -j4

最后,更新你的用户登陆时的环境变量:

代码语言:javascript复制
$ echo 'export PATH=/home/nvidia/cmake-3.13.0/bin/:$PATH' >> ~/.bashrc
$ source ~/.bashrc

CMake 现在已经可用于你的系统上了。请确保你没有在你的主文件夹中删除cmake-3.13.0/目录。

第七步#7:安装OpenCV 系统级依附件和其他开发依附件

现在我们从安装相关工具包开始,安装OpenCV 附件到我们的系统上。用parallelism编写OpenCV :

代码语言:javascript复制
$ sudo apt-get install build-essential pkg-config
$ sudo apt-get install libtbb2 libtbb-devv

接着,我们将安装几个编解码器和图像库:

代码语言:javascript复制
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install libxvidcore-dev libavresample-dev
$ sudo apt-get install libtiff-dev libjpeg-dev libpng-dev

接着我们将安装一些GUI库:

代码语言:javascript复制
$ sudo apt-get install python-tk libgtk-3-dev
$ sudo apt-get install libcanberra-gtk-module libcanberra-gtk3-module

最后,我们需要安装Video4Linux (V4L),这样我们就可以同时用USB 网络摄像头,再安装一个用于FireWire摄像头的库:

第八步#8:在你的Jetson Nano上设置Python 虚拟环境

图7:你在英伟达Jetson Nano上创建的每一个Python虚拟环境 都是不同于其他的独立的个体

我一定要强调:当想要同时开发和部署Python 项目时,建立Python虚拟环境是一个最佳操作。

虚拟环境允许单独安装不同的Python 包。当你使用了虚拟环境,你可以在一个环境中有某一个版本的Python库,并且在其他隔离的环境中有另一个版本的Python库。

在本教程的下半部分,我们将创建一个这样的虚拟环境;然而,你可以在第八步之后按照需要创建很多个环境。如果你对于这些不熟悉的话,你需要阅读关于虚拟环境的RealPython 指南。

第一步,我们要安装实际上管理Python包的工具,pip:

代码语言:javascript复制
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python3 get-pip.py
$ rm get-pip.py

然后我们需要安装我最喜欢的用来管理虚拟环境的工具包:virtualenv and virtualenvwrapper :

代码语言:javascript复制
$ sudo pip install virtualenv virtualenvwrapper

virtualenvwrapper 工具包在你没有增加信息到用户登陆时的环境变量之前都不算完全安装完。直接用nano 编辑器打开你的环境:

代码语言:javascript复制
$ nano ~/.bashrc

然后写入在文件的最后写入下面的几行:

代码语言:javascript复制
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

用nano编辑器底部显示的键盘快捷键保存并退出文件,然后运行环境变量来完成virtualenvwrapper的安装:

代码语言:javascript复制
 $ source ~/.bashrc

图8:由virtualenvwrapper 安装设置的终端输出证实没有错误

我们现在成功有了一个虚拟环境管理系统所以我们可以在我们的英伟达Jetson Nano上建立计算机视觉和深度学习的虚拟环境。

只要你没有遇到任何错误提示,virtualenv 和 virtualenvwrapper 目前已准备好按照第九步中需要为你去创建以及销毁虚拟环境。

第九步#9:创建你的‘py3cv4’虚拟环境

只要你在之前的步骤完成了安装virtualenv and virtualenvwrapper ,这一步非常简单。virtualenvwrapper 工具包提供了可在虚拟环境中运行的如下指令:

  • mkvirtualenv:创建一个Python 虚拟环境;
  • lsvirtualenv:列举所有已安装到你系统上的虚拟环境;
  • rmvirtualenv:去除一个虚拟环境;
  • workon:激活一个Python 虚拟环境;
  • deactivate:退出虚拟环境并带你回到系统环境;

假设你的第八步进行地很顺利,我们一起来在我们的Nano上创建一个python 虚拟环境:

代码语言:javascript复制
$ mkvirtualenv py3cv4 -p python3

我命名了这个虚拟环境为py3cv4以用来说明我们正在使用Python 3 和OpenCV 4。你可以按照自己的喜好,项目需要,甚至自己的创造力来随意命名。

当你的环境准备好以后,你的命令提示符都将由py3cv4来执行。如果你的命令行提示符显示执行的名字不是你虚拟环境的名字,你可以随时使用workon命令:

代码语言:javascript复制
 $ workon py3cv4

图9:确保在之后的教程中,你的命令行提示符的开头都是你虚拟环境名字

在接下来的所有过程中,你必须在名为‘py3cv4’的虚拟环境中进行操作。

第十步#10:安装Protobuf 编译器

这个环节带你一起一步一步安装可以加速TensorFlow 的protobuf。

如果TensorFlow缺少有效运行的 protobuf 和libprotobuf,那么它的表现会被严重削减。

当我们用pip来安装TensorFlow,它会自动安装一个不一定是理想版本的protobuf。对于TensorFlow运行慢的问题在英伟达开发者论坛有详细说明。

首先,下载并安装一个有效运行的protobuf 编译器(资源):

代码语言:javascript复制
$ wget https://raw.githubusercontent.com/jkjung-avt/jetson_nano/master/install_protobuf-3.6.1.sh
$ sudo chmod  x install_protobuf-3.6.1.sh
$ ./install_protobuf-3.6.1.sh

这个安装过程大概需要1个小时,所以可以去散个步,或者读一本好书,比如《计算机视觉的树莓派》(Raspberry Pi for Computer Vision)或者《与Python学习计算机视觉和深度学习》(Deep Learning for Computer Vision with Python)。

一旦protobuf 安装到了你的系统上,你还需要在你的虚拟环境里执行以下操作:

代码语言:javascript复制
$ workon py3cv4 # if you aren't inside the environment
$ cd ~
$ cp -r ~/src/protobuf-3.6.1/python/ .
$ cd python
$ python setup.py install --cpp_implementation

注意我们更倾向用setup.py来安装脚本而不是直接用pip去安装。这样的好处是我们特意为Nano处理器编写软件而不是用通用的预编译的二进制。

在剩下的步骤中,我们会交替用setup.py (需要优化编写时)和pip(通用编写就足够时)。

让我们继续第十一步来安装深度学习软件。

第十一步#11:安装TensorFlow/Keras 和他们的依附件

首先确保你在虚拟环境中:

代码语言:javascript复制
$ workon py3cv4

然后安装 NumPy 和 Cython:

代码语言:javascript复制
$ pip install numpy cython

你可能会遇到的错误提示:

代码语言:javascript复制
ERROR: Could not build wheels for numpy which use PEP 517 and cannot be installed directly.

如果你遇到了这个提示,跟着接下来的解决步骤。首先,用最高用户权限来安装 NumPy:

代码语言:javascript复制
$ sudo pip install numpy

然后,建立一个从你系统上的NumPy到你虚拟环境目录位置的符号连接。这个建立需要你有NumPy的安装路径,这个可以通过如下的使用卸载NumPy的命令并取消该命令来看到:

代码语言:javascript复制
$ sudo pip uninstall numpy
Uninstalling numpy-1.18.1:
  Would remove:
    /usr/bin/f2py
    /usr/local/bin/f2py
    /usr/local/bin/f2py3
    /usr/local/bin/f2py3.6
    /usr/local/lib/python3.6/dist-packages/numpy-1.18.1.dist-info/*
    /usr/local/lib/python3.6/dist-packages/numpy/*
Proceed (y/n)? n

注意你应该在提示符处输入n, 因为我们并不想让它真的开始卸载NumPy。然后,记录下安装路径(高亮处),并执行下面的指令(记得改相对应的路径):

代码语言:javascript复制
$ cd ~/.virtualenvs/py3cv4/lib/python3.6/site-packages/
$ ln -s ~/usr/local/lib/python3.6/dist-packages/numpy numpy
$ cd ~

到这步,NumPy已经连接到你的虚拟环境。我们应该快速测试一下NumPy,因为本教程后面的步骤还需要用到NumPy。在终端运行下面的命令:

代码语言:javascript复制
$ workon py3cv4
$ python
>>> import numpy

现在NumPy已经安装完毕,我们来安装SciPy。我们需要在Nano上能兼容TensorFlow 1.13.1的SciPy v1.3.3。因此我们不能用pip。反之我们需要从GitHub上直接获取一个版本(DevTalk link推荐:https://forums.developer.nvidia.com/t/scipy-not-getting-installed-on-jetson-nano-inspite-of-all-dependencies/110034)并安装:

代码语言:javascript复制
$ wget https://github.com/scipy/scipy/releases/download/v1.3.3/scipy-1.3.3.tar.gz
$ tar -xzvf scipy-1.3.3.tar.gz scipy-1.3.3
$ cd scipy-1.3.3/
$ python setup.py install

安装SciPy需要大概35分钟。看着它来等它安装好就像在等待油画颜料变干,所以你也许需要打开一个我的书或者课程并且重温一下关于计算机视觉或者深度学习的相关技能。

现在我们安装了英伟达的对于Jetson Nano最优化的TensorFlow 1.13。当然你可能会疑惑:

“为什么我不能在英伟达Jetson Nano上使用TensorFlow 2.0?”

这是一个很好的问题,我将让我的Jetson Nano专家,Sayak Paul来回答这个问题:

“虽然TensorFlow 2.0是可以安装在Nano上的,但是它之所以不被推荐是因为Jetson Nano 的OS上可能有一些与版本TensorRT不兼容的问题。另外,用于Nano的TensorFlow 2.0 有一些内存泄漏问题,这些问题可以使Nano冻结或者中止。由此,我们目前推荐TensorFlow 1.13。”

基于Sayak的专业解说,我们现在继续来安装TF1.13:

代码语言:javascript复制
$ pip install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1 nv19.3

继续用pip来简单操作Keras的安装:

代码语言:javascript复制
$ pip install keras

现在我们将在Jetson Nano上安装TFOD API。

第十二步#12:在Jetson Nano上安装TensorFlow 目标检测API

这一步,我们将在Jetson Nano上安装TensorFlow 目标检测API。

TensorFlow 目标检测API(TFOD API)是一个通常用于开发目标检测的模型库。我们用它为Nano的图形处理器去优化模型。

英伟达的tf_trt_models是一个TFOD API的封装器,它允许用来建立冻结图形(建模的必备条件)。更多的关于tf_trt_models的信息可以在英伟达的知识库上找到。

此外,确保所有的操作都在你的虚拟环境里:

代码语言:javascript复制
$ cd ~
$ workon py3cv4

首先,克隆TensorFlow知识库里main的models:

为了让其可复制,你需要检测并确保其支持TensorFlow 1.13.1:

然后,安装可用于 COCO 数据库,特别是目标检测的COCO API:

代码语言:javascript复制
$ cd ~
$ git clone https://github.com/cocodataset/cocoapi.git
$ cd cocoapi/PythonAPI
$ python setup.py install

下一步是用TFOD API去编译Protobuf 库。Protobuf 库让我们能够以语言不可知的方式去串行化已结构化的数据:

代码语言:javascript复制
$ cd ~/models/research/
$ protoc object_detection/protos/*.proto --python_out=.

从这里,我们安置了一个我命名为 setup.sh的脚本,这个脚本你每一次在Nano上部署时用到TFOD API 时都会被用到。用Nano编辑器创建一个这样的文件夹:

代码语言:javascript复制
$ nano ~/setup.sh

在新文件中写入如下几行:

代码语言:javascript复制
#!/bin/sh
export PYTHONPATH=$PYTHONPATH:/home/`whoami`/models/research:
/home/`whoami`/models/research/slim

最上面的解释伴随行表明这个文件是可执行的,且这个脚本根据TFOD API安装目录来安置你的pythonpath。按照nano编辑器底部显示的键盘快捷键保存并退出文件。

第十三步#13:安装 在Jetson Nano上英伟达的‘tf_trt_models’

这一步中,我们将从GitHub的库中安装‘tf_trt_models’,这个包里包含了针对Jetson Nano的TensorRT 最优化模型。

首先,确保你在py3cv4的虚拟环境里:

代码语言:javascript复制
$ workon py3cv4

然后直接克隆GitHub的repo,并执行安装脚本:

代码语言:javascript复制
$ cd ~
$ git clone --recursive https://github.com/NVIDIA-Jetson/tf_trt_models.git
$ cd tf_trt_models
$ ./install.sh

就这样。下一步我们来安装OpenCV。

第十四步#14:安装OpenCv

这个环节我们要借助CUDA(https://www.pyimagesearch.com/2020/02/03/how-to-use-opencvs-dnn-module-with-nvidia-gpus-cuda-and-cudnn/)来安装OpenCV库。

OpenCV是一个用于做图片处理、DNN模组的深度学习、基本演示任务等常用库。我为你创建了一个OpenCv教程(https://www.pyimagesearch.com/2018/07/19/opencv-tutorial-a-guide-to-learn-opencv/),如果你感兴趣可以学到一些基础。

CUDA是英伟达用于图形处理器的一组库。一些非深度学习任务在CUDA适用的图形处理器上运行的比中央处理器更快。因此,我们会安装支持CUDA的OpenCV,这样英伟达Jetson Nano就有了一个小的可适用CUDA的图形处理器。

本环节基于PythonOps 网站作者的辛勤付出。

我们将继续从源码编写,首先从GitHub下载OpenCV 资源码:

代码语言:javascript复制
$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.2.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.1.2.zip

注意OpenCV 和OpenCV-contrib的版本要吻合才能兼容。

然后,提取文件,便捷起见进行重命名目录:

代码语言:javascript复制
$ unzip opencv.zip
$ unzip opencv_contrib.zip
$ mv opencv-4.1.2 opencv
$ mv opencv_contrib-4.1.2 opencv_contrib

激活你的Python虚拟环境如果它还未处于活跃状态的话:

代码语言:javascript复制
$ workon py3cv4

更改OpenCV的目录,并创建和建立新目录:

代码语言:javascript复制
$ cd opencv
$ mkdir build
$ cd build

当你位于以下两个位置以后接着输入的CMake指令非常重要,因此我再确认下,是否当前已经在 (1)~/opencv/build目录下,(2)虚拟环境py3cv4

代码语言:javascript复制
(py3cv4) $ pwd
/home/nvidia/opencv/build

我通常不在命令提示符显示虚拟环境的名字,因为这个也会占内存,但是注意我在提示符一开始的地方确认了我们处于正确的虚拟环境。

另外,pwd命令的结果表明我们确实在build/ 目录中。

当你完成了上述两个条件,你现在可以用CMake 编写预备工具:

代码语言:javascript复制
$ cmake -D CMAKE_BUILD_TYPE=RELEASE 
  -D WITH_CUDA=ON 
  -D CUDA_ARCH_PTX="" 
  -D CUDA_ARCH_BIN="5.3,6.2,7.2" 
  -D WITH_CUBLAS=ON 
  -D WITH_LIBV4L=ON 
  -D BUILD_opencv_python3=ON 
  -D BUILD_opencv_python2=OFF 
  -D BUILD_opencv_java=OFF 
  -D WITH_GSTREAMER=ON 
  -D WITH_GTK=ON 
  -D BUILD_TESTS=OFF 
  -D BUILD_PERF_TESTS=OFF 
  -D BUILD_EXAMPLES=OFF 
  -D OPENCV_ENABLE_NONFREE=ON 
  -D OPENCV_EXTRA_MODULES_PATH=/home/`whoami`/opencv_contrib/modules ..

这边有很多的编译器标记,我们一起来看一下。注意已设置WITH_CUDA=ON,表明我们将使用CUDA优化编译。

此外,注意我们已经在OPENCV_EXTRA_MODULES_PATH中为我们的opencv_contrib 文件提供了路径,且我们已经设定了OPENCV_ENABLE_NONFREE=ON,表明我们将安装可以完整支持外部或者专利算法的OpenCV。

确保完整复制上述的命令,包括底部的'..' 。当CMake完成后,你将看到终端有如下输出:

图10:当安装OpenCV 计算机视觉库的时候,在编译过程前检查你的CMake输出是至关重要的

我非常推荐你在此页面上滑,仔细审查终端输出确认没有任何错误。如有错误需要解决才能继续下一步。如果你发现错误,那么很有可能是第五步到第十一步之间的某一个前提条件没有被正确安装,请试着确认问题并修复它。

如果你修复了一个问题,那么你在再次运行CMake前需要删除并重新建立目录:

代码语言:javascript复制
$ cd ..
$ rm -rf build
$ mkdir build
$ cd build
# run CMake command again

当你对CMake输出满意之后,就可以用Make启动编译过程:

代码语言:javascript复制
$ make -j4

编译OpenCV 会需要大概2.5小时。当结束后,你需要看到100%,且你的命令提示符会返回:

图11:一旦make命令达到100%你可以继续设置你的英伟达 Jetson Nano

接着,我们需要结束安装。第一步,运行安装指令:

代码语言:javascript复制
$ sudo make install

然后,我们需要创建一个从OpenCV的安装目录到虚拟环境的符号连接。符号连接是类似一个特殊运行系统文件的指针,从你电脑中(对于我们来说就是我们的Nano)的一个地方指向另一个地方.让我们现在一起来建立一个符号连接(sym-link):

代码语言:javascript复制
$ cd ~/.virtualenvs/py3cv4/lib/python3.6/site-packages/
$ ln -s /usr/local/lib/python3.6/site-packages/cv2/python3.6/cv2.cpython-36m-aarch64-linux-gnu.so cv2.sov

OpenCV 已经正式安装完成了。在下一个环节,我们需要安装几个有用的库来辅助我们目前为止已安装好的一切。

第十五步#15:用pip安装其他有用的库

这个环节,我们将用pip 安装额外的包到我们的虚拟环境。

直接激活你的虚拟环境:

代码语言:javascript复制
$ workon py3cv4

然后按下图安装用于机器学习,图片处理和绘图的包:

代码语言:javascript复制
$ pip install matplotlib scikit-learn
$ pip install pillow imutils scikit-image

再下载Davis King’s dlib 库:

代码语言:javascript复制
$ pip install dlib

注意:当你可能用CUDA相关试着编译dlib时,目前为止的dlib都不支持Nano的图形处理器。资源:(1)dlib GitHub issues and (2) NVIDIA devtalk forums。

现在下载Flask(一个Python微型网站服务器)和Jupyter(一个网页版本的Python环境):

代码语言:javascript复制
$ pip install flask jupyter

最后,为TFOD API安装我们的XML工具包和进度条来追踪终端软件,这将花很长时间:

代码语言:javascript复制
$ pip install lxml progressbar2

干得漂亮,但是最后一步还未完成。下一步,我们将测试我们的安装。

第十六步#16:测试和确认

到这步我总是喜欢测试我的安装来确保所有都是像我预期的那样运行,这样一个快速确认可以在你准备在你的Jetson Nano上部署计算机视觉和深度学习项目的过程中节省时间。

  • 测试 TensorFlow和Keras

为了测试TensorFlow和Keras,简单的在Python shell中输入:

代码语言:javascript复制
$ workon py3cv4
$ python
>>> import tensorflow
>>> import keras
>>> print(tensorflow.__version__)
1.13.1
>>> print(keras.__version__)
2.3.0

再次申明,我们并不是要安装TensorFlow2.0。当我写这篇帖子的时候,即2020年3月,TensorFlow 2.0是还不支持TensorRT的,而且还有内存泄露问题。

  • 测试 TFOD API

为了测试TFOD API,我们需要先运行设置脚本:

代码语言:javascript复制
$ cd ~
$ source ./setup.sh

然后按照图12执行测试程序:

图12:确保在继续安装嵌入式计算机视觉和深入学习前,你的英伟达Jetson Nano通过了所有TFOD API 测试

假设你运行的每个测试都看到了“ok”,继续~

  • 测试OpenCV

为了测试openCV,我们简单地把它导入python shell并加载与显示一张图:

代码语言:javascript复制
$ workon py3cv4
$ wget -O penguins.jpg http://pyimg.co/avp96
$ python
>>> import cv2
>>> import imutils
>>> image = cv2.imread("penguins.jpg")
>>> image = imutils.resize(image, width=400)
>>> message = "OpenCV Jetson Nano Success!"
>>> font = cv2.FONT_HERSHEY_SIMPLEX
>>> _ = cv2.putText(image, message, (30, 130), font, 0.7, (0, 255, 0), 2)
>>> cv2.imshow("Penguins", image); cv2.waitKey(0); cv2.destroyAllWindows()

图13:用于计算机视觉的OpenCV (用CUDA编译)以及python可以在英伟达Jetson Nano上正常运作

  • 测试你的网络摄像头

这这个环节,我们将开发一个临时应急的脚本,用(1)PiCamera或者(2)USB 摄像头来测试你的英伟达Jetson nano摄像头。

你知道到Jetson Nano与你的树莓派的PiCamera兼容吗?

事实上是的,但是需要一个源字符串来和驱动交互。在这个环节我们将准备一个脚本来看它是怎么运作的。

首先,用图示的带状缆线连接你的PiCamera到你的Jetson Nano:

图14:你的Jetson Nano可用MIPI接口来兼容你的PiCamera

下一步,为测试脚本,请确保你有本文涉及的所有的“下载文件”。一起来回顾一下 test_camera_nano.py 的脚本:

代码语言:javascript复制
# import the necessary packages
from imutils.video import VideoStream
import imutils
import time
import cv2
# grab a reference to the webcam
print("[INFO] starting video stream...")
#vs = VideoStream(src=0).start()
vs = VideoStream(src="nvarguscamerasrc ! video/x-raw(memory:NVMM), " 
  "width=(int)1920, height=(int)1080,format=(string)NV12, " 
  "framerate=(fraction)30/1 ! nvvidconv ! video/x-raw, " 
  "format=(string)BGRx ! videoconvert ! video/x-raw, " 
  "format=(string)BGR ! appsink").start()
time.sleep(2.0)

这个脚本可用于 OpenCV和图中显示的2-4行里的imutils。

用imutils 的video 模组,一起从9-14行创建一个视频流(VideoStream):

  • USB 摄像头:目前注释在第9行,为了用你的USB 网络摄像头,你只需要提供src = 0 或者其他设备依次顺序(如果你有超过一个USB 摄像头连接到你的Nano)
  • PiCamera:目前激活于10-14行,一个长src 字符串将被用于作用于你的Nano的去驱动来访问一个插入到MIPI接口的PiCamera。你可以看到,格式字符串中的宽度和高度表示1080p的分辨率。你可以用另外一个兼容PiCamera的分辨率。

我们对Picamera更感兴趣,所以我们将重点关注第10-14行。在这部分将激活一个流来用于Nano进行PiCamera使用的交互。注意逗号,感叹号和空格。一定要确保src字符串正确,所以请谨慎地输入。

下一步,我们将获取并显示帧:

代码语言:javascript复制
# loop over frames
while True:
  # grab the next frame
  frame = vs.read()
  # resize the frame to have a maximum width of 500 pixels
  frame = imutils.resize(frame, width=500)
  # show the output frame
  cv2.imshow("Frame", frame)
  key = cv2.waitKey(1) & 0xFF
  # if the `q` key was pressed, break from the loop
  if key == ord("q"):
    break
# release the video stream and close open windows
vs.stop()
cv2.destroyAllWindows()

现在我们将开始在帧(frame)上进行循环。我们调整(resize)帧的大小,并于OpenCV窗口上显示在我们屏幕上。如果按了q键,我们将退出这个循环并清除。

为了执行脚本,简单的输入如下指令:

代码语言:javascript复制
$ workon py3cv4
$ python test_camera_nano.py

图15:测试PiCamera和Jetson Nano关于安置计算机视觉和深度学习

如你所见,现在我们的PiCamera可与NVIDIA Jetson Nano一起正常使用。

有没有更快的方法来启动和运行?

有一个方法能够取代这个痛苦,耗时两天以上的Nano配置过程,我建议直接从Raspberry Pi for Computer Vision 获取一个完成包。

我的书包括pre-configured Nano.img 与我的团队一起开发的即将完成。包括TensorFlow/Keras,TensorRT, OpenCV, scikit-image,scikit-learn和更多。

你只需要简单地完成以下:

  1. 下载Jetson Nano.img 文件;
  2. 把它闪存到microSD卡中;
  3. 启动你的Nano;
  4. 开始你的项目。

这个.img文件本身就值了这一整个包的价格。

就像PeterLans,一个资深软件顾问说的那样:

“为Jetson Nano设置一个开发环境是很很恐怖的,经历了几次尝试以后,我放弃了并且决定从长计议。直到现在我的Jetson的最好命运是:在抽屉里吃灰。

但是现在我有了一个把它弄干净并且运行起来的理由。不光是因为Adrian的材料很棒而且易懂,更因为预装的Nano .img而变得很容易,让为计算机视觉的树莓派的价格更加诱人。

给任何对于Adrian’s RPi4CV的书感兴趣的人:诚实面对自己并且计算下你将浪费的时间。你会意识到浪费的时间要比闲置一本书来得更不划算。”

我的.img 文件是定期更新并分发给顾客,我也会提供顶级支持给到我的书或者我的课程的顾客,有一些我没有办法免费给所有网站上到访这个网页的人。

简单地说,如果你需要从我这获得Jetson Nano的帮助,我推荐获取一个Raspberry Pi for Computer Vision的副本,这个是网站上可获得的最好的关于嵌入式计算机视觉和深度学习的教材。

不只是.img文件,RPi4CV还包括如何在以下设备上应用计算机视觉,深度学习,和OpenCV:

  • Raspberry Pi
  • Intel Movidus NCS
  • Google Coral
  • NVIDIA Jetson Nano

在这里面你会找到40个项目,包括60 的章节。

一些高亮的项目包括:

  • 交通量统计和车速检测
  • 实时脸部识别
  • 建立课堂考勤制度
  • 自动化收视识别
  • 日间和夜间的野生动物监测
  • 安全应用
  • 深度学习分类,目标检测,和资源限制设备的人体姿态估计
  • 更多

总结

在这个教程中,我们为基于python的深度学习和计算机视觉安置了英伟达 Jetson Nano.我们从闪存Jetpack.img开始。并安装了所有必要条件。我们接着安置了一个python虚拟环境来部署计算机视觉和深度学习项目。

在我们的虚拟环境里,我们安装了TensorFlow,TensorFlow Object Detection (TFOD) API,TensorRT和OpenCV。

我们圆满完成了测试软件安装,还开发了一个临时的Python脚本来测试PiCamera和USB摄像头。

如果你对树莓派和英伟达的Jetson Nano的计算机视觉和深度学习感兴趣,请一定来领取一个Raspberry Pi for Computer Vision的副本(https://www.pyimagesearch.com/raspberry-pi-for-computer-vision/)。

原文标题:

How to Configure your NVIDIA Jetson Nano for Computer Vision and Deep Learning

原文链接:

https://www.pyimagesearch.com/2020/03/25/how-to-configure-your-nvidia-jetson-nano-for-computer-vision-and-deep-learning/

0 人点赞