NVIDIA Jetson Nano Developer Kit 入门

举报
xcc-2022 发表于 2022/06/12 10:39:52 2022/06/12
【摘要】 NVIDIA 基于 GPU 的硬件入门在过去的一两年里,有大量的定制芯片旨在加速边缘的机器学习。首先到达的是英特尔及其基于Moividius的硬件,最近我们看到了Google基于Edge TPU的硬件的出现。然而,传统上,NVIDIA在这个领域的产品——围绕基于GPU的硬件构建——功率更高,而且相对昂贵。然而,随着每个人都走向边缘,看到他们推出一些更实惠的东西可能并不奇怪。新的Jetson...

NVIDIA 基于 GPU 的硬件入门

在过去的一两年里,有大量的定制芯片旨在加速边缘的机器学习。首先到达的是英特尔及其基于Moividius的硬件,最近我们看到了Google基于Edge TPU的硬件的出现。然而,传统上,NVIDIA在这个领域的产品——围绕基于GPU的硬件构建——功率更高,而且相对昂贵。

然而,随着每个人都走向边缘,看到他们推出一些更实惠的东西可能并不奇怪。

image.png

新的Jetson Nano仍然基于他们现有的GPU技术,因此与更昂贵的Jetson TX和AGV Xavier板“向上兼容”。

打开盒子

Jetson Nano Developer Kit在另一个不起眼的盒子里到达。盒子内部是载板本身,带有Jetson Nano模块和已经安装的散热器。包装盒中还有一个小传单,指向您获取说明,并让您知道应该使用哪些端口来为主板以及显示器键盘鼠标供电。

最后,我突然又加了一个纸架,我立刻把它扔掉了。如果我想把板子从桌子上抬起来,我只需添加一些橡胶保险杠脚。这感觉比纸架更安全吗?

image.png

Jetson Nano Developer Kit 的尺寸为 80 × 100 × 28 mm,重量为 140g,并不是一块小巧的电路板。事实上,我甚至会说,对于打算部署为边缘计算的产品来说,它不仅仅是超大尺寸。
1_tNf0yEd0KLtdUWYNtEpcfw.jpeg
1_80GWV8QGKKbMUwP4hOQTKQ.jpeg

[^简森Nano与Raspberry Pi 3,B +型相比]:

Jetson Nano模块本身在散热器下方可见,整洁且尺寸合理。但是,安装在模块顶部的散热器(希望是超大的)又大又笨拙。这也不令人放心。

image.png

[^硬件附带风扇?]:

虽然未包含在零售包装盒中,但当 NVIDIA 将预发布硬件交付给我进行审核时,会附带一个可选风扇。不让人放心。

收集物资

与谷歌和英特尔硬件不同,如果不使用显示器键盘鼠标,似乎不可能设置Jetson Nano。

如今,除了无头模式之外,我很少使用电路板。所以,感觉就像十年前一样,在事情真的出错后,我走到校园的另一边去数据中心使用机架的KVM交换机,我继续挖出了我使用的便携式显示器键盘鼠标,当我的一个Raspberry Pi项目一切都出错时。

image.png

[^开始设置 NVIDIA Jetson Nano 所需的一切。]:

除了显示器,键盘和鼠标外,您还需要USB电源和USB-A到微型USB电缆将其连接到Jetson Nano,以及HDMI电缆以将Jetson Nano连接到显示器。不出所料,您还需要一张最小尺寸为32GB的微型SD卡

⚠️警告 虽然操作系统映像和其他安装可以轻松安装在 16GB 卡上,但使用该小卡通常会导致根文件系统归档,并在推理过程中出现“设备上没有剩余空间”错误。

令人惊讶的是,Jetson Nano载板上可能没有对Wi-Fi的板载支持,因此您还必须挖掘以太网电缆,并希望将其放置在离路由器足够近的位置,以便将其连接到LAN。或者,您可以拿起USB Wi-Fi加密狗,并希望您可以获得NVIDIA的L4T发行版来支持它。

与直接竞争相比,这只是为了入门而需要大量供应。

为载板提供动力

NVIDIA 建议 Jetson Nano Dev 套件应使用能够提供 2A 至 3.5A 电流的 5V 微型 USB 电源供电,并进一步建议,如果您*“…正在运行基准测试或工作负载繁重*。这是电源的一个潜在的相当有问题的规格要求。

考虑到为Raspberry Pi找到可靠的2.5A电源是多么困难,官方的Raspberry Pi USB电源是为数不多的好选择之一,我不确定您实际上会在哪里采购可行的3.5A USB电源?特别是因为据我所知,实际上通过USB提供3.5A远远超出了USB规格。

幸运的是,该板还具有一个桶形插孔,您可以使用跳线在micro USB和桶形插孔之间切换。这意味着,如果您的USB电源出现欠压问题,则可以使用“正常”直流电源为其供电。

获取操作系统

您需要做的第一件事是抓住Jetson Nano Developer Kit卡图像,它的重量约为5.64GB,全部压缩起来,大约是Raspbian平均下载量的五倍。

那么,也许可以煮一杯咖啡?

对于这些天燃烧的卡片图像,我通常推荐由Balena的人制作的Etcher。它是跨平台的 - 它适用于Windows,Linux和Mac OS - 并允许您在四次点击中刻录图像。
image.png

[^使用蚀刻器刻录 卡片图像。]:

但是,如果您是像我这样的命令行人员,则可以下载并安装现已弃用的实验性Etcher命令行工具,或者您仍然可以继续以老式方式进行操作。

这里的说明是针对Mac的,因为这是我桌子上的,但是Linux的说明是相似的。

继续将micro SD卡插入适配器,然后将卡和适配器插入Macbook。然后打开“终端”窗口并键入 ,并检查 SD 卡的设备名称。在我的情况下,它是,在写入卡时,我需要使用相应的原始设备。df -h``/dev/disk1``/dev/rdisk1

继续并从命令行卸载卡,

$ sudo diskutil unmount /dev/disk1s1

而不是通过将其拖到废纸篓中来弹出它。然后,我们可以继续操作图像,并将图像写入我们的SD卡。

$ unzip jetson-nano-sd-r32.120190318.zip
$ sudo dd bs=1m if=jetson-nano-sd-r32.120190318.img of=/dev/rdisk1

如果上述命令报告错误,请更改为 。完成映像的写入后,应自动重新装载映像的启动分区。dd: bs: illegal numeric value``bs=1m``bs=1M``dd

设置Jetson Nano

将开发板插入显示器键盘鼠标,然后继续将微型 SD 卡插入 Jetson Nano 模块底部的插槽中。
image.png

微型 SD 卡插槽位于 Jetson Nano 模块上,而不是在载板上。您应该在模块和载板上寻找插槽。

最后,继续将其连接到电源并在板上供电。微型USB连接旁边的绿色LED应该在您打开电源后立即亮起,并且在它完成启动后,您将完成一些初始设置。
image.png

[^首次启动Jetson Nano。]:

⚠️警告 Jetson Nano似乎对其HDMI连接特别挑剔,并且不会与我随身携带的三台较旧的显示器进行调试。这可能是由于旧硬件上的HDMI握手问题而下降的。这不是我以前在单板计算机上见过的问题。入门说明确实包括一个说明,指出“不支持HDMI到DVI适配器。请使用接受 HDMI 或 DP 输入的显示器。

您首先必须接受软件EULA,然后选择首选的系统语言,键盘布局和当前时区。最后,系统将要求您创建一个用户(此用户将具有管理员权限)并选择主机名。为了简单起见,我创建了一个名为“jetson”的用户,并同样选择作为我的主机名。jetson

将主板连接到无线网络

事实证明,NVIDIA L4T对USB Wi-Fi适配器的支持很差,而且我桌上的大多数适配器都不适用于发行版。

不受支持的适配器列表包括真正常见的基于RT5370的加密狗,以及具有Broadcom芯片组的官方Raspberry Pi Wi-Fi适配器。然而,在我的备件箱中翻找后,我设法找到了一个不太常见的基于RT8188CUS的加密狗,我的是Edimax EW-7811Un,幸运的是它得到了支持。

继续并通过右键单击桌面并从下拉菜单中选择“打开终端”来打开终端。

image.png

[^打开终端窗口]:

您通常可以通过将适配器插入主板后查看命令的输出来判断您的硬件保护装置所基于的芯片组。因此,在我们新的终端窗口类型中,lsusb

$ lsusb
Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 011: ID 7392:7811 Edimax Technology Co., Ltd EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]
Bus 001 Device 004: ID 248a:8367
Bus 001 Device 003: ID 045e:07fd Microsoft Corp. Nano Transceiver 1.1
Bus 001 Device 002: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$

在这里,您可以在这里看到我的无线键盘鼠标的适配器,以及基于RTL8188的无线适配器。您还可以使用该命令检查是否已加载相应的内核模块。lsmod

$ lsmod | grep rt
rtl8xxxu              115372  0
rtl8192cu              85379  0
rtl_usb                14074  1 rtl8192cu
rtl8192c_common        54245  1 rtl8192cu
rtlwifi                88873  3 rtl_usb,rtl8192c_common,rtl8192cu
btrtl                   7318  1 btusb
rt2800usb              22944  0
rt2x00usb              12492  1 rt2800usb
rt2800lib              80870  1 rt2800usb
rt2x00lib              61822  3 rt2800lib,rt2800usb,rt2x00usb
mac80211              719792  7
rt2800lib,rt2x00lib,rt2x00usb,rtl_usb,rtlwifi,rl8192cu,rtl8xxxu
cfg80211              589351  3 rt2x00lib,mac80211,rtlwifi
$

支持我的 RT8188 加密狗由 RT8192 驱动程序提供。最后,您可以使用该命令检查是否已正确检测到它。然后,我们可以将其连接到您的无线网络。nmcli

$ nmcli 
wlan0: disconnected
"Realtek 802.11n WLAN Adapter"
wifi (rtl8192cu), 74:DA:38:58:6F:0F, hw, mtu 1500

$ sudo nmcli dev wifi connect MY_SSID password MY_PASSWORD ifname wlan0
Device 'wlan0' successfully activated with 'e08e5ecf-b2a5-4b32-ac2a-44b6754867f8'.
$

激活后,我们可以检查连接的状态。

$ nmcli connection show
NAME                UUID                                  TYPE      DEVICE
MY_SSID             e08e5ecf-b2a5-4b32-ac2a-44b6754867f8  wifi      wlan0
Wired connection 1  d0d5acde-fcfe-3d3a-bc1d-584df2b7bfb2  ethernet  eth0
l4tbr0              d0cb0095-06cf-4528-b9f3-18a8cf740122  bridge    l4tbr0
$

虽然此时主板应该从您的DHCP服务器获取IP地址,但有时它不会,这可能是由于各种原因,因此此时重新启动可能是最快的。然后,您可以使用该命令找出无线地址。wlan0``ip

$ ip addr | grep wlan0
7: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.1.118/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0

您的 Jetson Nano 现在已连接到您的无线网络,您应该能够拔下以太网电缆。

启用桌面共享

不幸的是,Jetson桌面上留下的有关如何从命令行启用已安装的VNC服务器的说明不起作用,并且继续打开桌面上的“设置”应用程序并单击“桌面共享”也失败了,因为设置应用程序静默崩溃。问题似乎归结为与较旧的Gnome桌面不兼容

有许多方法可以解决此问题,最简单的方法是命令行和图形修复的混合。您需要做的第一件事是编辑架构以还原缺少的参数。org.gnome.Vino``enabled

在您喜欢的编辑器中打开架构,

$ sudo vi /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml

并继续将以下键添加到 XML 文件中。

<key name='enabled' type='b'>
   <summary>Enable remote access to the desktop</summary>
   <description>
   If true, allows remote access to the desktop via the RFB
   protocol. Users on remote machines may then connect to the
   desktop using a VNC viewer.
   </description>
   <default>false</default>
</key>

然后使用该命令编译 Gnome 模式。glib-compile-schemas

$ sudo glib-compile-schemas /usr/share/glib-2.0/schemas

这个快速技巧应该可以阻止“桌面共享”面板崩溃,允许您打开它。因此,请继续并单击“设置”图标,然后单击顶部行中的“桌面共享”图标。

image.png

[^桌面共享设置面板]:

勾选“允许其他用户查看您的桌面”以及“允许其他用户控制您的桌面”复选标记。然后确保“您必须确认每次访问此计算机”已关闭。最后勾选“要求用户输入此密码”复选标记,然后输入 VNC 会话的密码。

关闭“设置”面板,然后单击屏幕左上角的绿色图标以打开“搜索”面板。在屏幕顶部显示的搜索框中键入“启动应用程序”。

image.png

[^搜索您的应用]:

单击应用程序以打开“启动应用程序首选项”面板。在这里,我们可以将VNC添加到登录计算机时自动启动的应用程序列表中。
image.png

[^“启动应用程序首选项”面板。]:

单击框的右侧,然后在名称框中键入“Vino”,然后在命令框中输入 。最后,您可以添加注释,也许是“VNC服务器”。单击框的右下角,然后关闭应用。Add``/usr/lib/vino/vino-server``Save

⚠️警告 Vino 支持的加密是 TLS 安全类型 (18),大多数查看器(包括 TigerVNC、TightVNC 和 RealVNC 等流行查看器)都广泛不支持这种加密。这种不兼容性是一个已知的问题,并且已经存在了五年多。它可能不会很快消失。

最后,打开一个终端,有点遗憾的是,您可能需要禁用VNC连接的加密才能使事情正常工作。

$ gsettings set org.gnome.Vino require-encryption false
$ gsettings set org.gnome.Vino prompt-enabled false

您现在应该继续并重新启动开发板,然后重新启动,重新登录到您的帐户。VNC 现在应该正在运行并为桌面提供服务。

您可以使用该命令从笔记本电脑中检查这一点。nmap

$ nmap jetson
Starting Nmap 7.70 ( https://nmap.org ) at 2019-04-13 01:11 BST
Nmap scan report for jetson (192.168.1.118)Host is up (0.0030s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
111/tcp  open  rpcbind
5900/tcp open  vnc
Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
$

如果您还没有在笔记本电脑上安装VNC Viewer,RealVNC为Windows,Linux和macOS以及许多其他平台提供了VNC Viewer应用程序。因此,请继续下载该应用程序并将其安装在笔记本电脑上。

image.png

image.png

[^通过VNC连接到Jetson Nano。]:

安装后,打开与 的 VNC 连接。系统将警告您 VNC 会话上缺少加密,然后提示您输入密码。jetson

image.png

[^桌面通过 VNC。]:

如果一切正常,您应该在窗口中看到桌面。就是这样。您现在已通过 VNC 连接到 Jetson Nano。

启用远程桌面

不幸的是,VNC服务器只有在用户在控制台上登录到Jetson Nano时才会运行。如果注销,服务器将停止。您不能只是拔下显示器键盘鼠标,然后在无外设模式下运行开发板。

如果要这样做,最简单的方法可能是运行一个名为 的 RDP 服务器。安装比设置 VNC 简单得多。xrdp

$ sudo apt-get install xrdp

安装完成后,您应该继续并重新启动 Jetson Nano 板。重新启动完成后,您可以使用笔记本电脑中的命令检查 安装是否成功。xrdp ``nmap

$ nmap jetson
Starting Nmap 7.70 ( https://nmap.org ) at 2019-04-13 01:39 BST
Nmap scan report for jetson (192.168.1.118)
Host is up (0.0025s latency).
Not shown: 996 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
111/tcp  open  rpcbind
3389/tcp open  ms-wbt-server
Nmap done: 1 IP address (1 host up) scanned in 1.25 seconds
$

如您所见,由于我们未登录,我们的VNC服务器已关闭,但是尽管我们当前处于物理机上的登录屏幕,但RDP服务器仍在运行。

虽然RDP是一种专有协议,但微软确实免费为大多数平台提供查看器,包括Mac,可在Mac App Store中使用

您应该继续安装它。
image.png

[^您可以从Mac App Store安装Microsoft Remote Desktop。]:

打开微软远程桌面,然后单击“添加桌面”。

1_Kvd_wMTEKpzknythBej6-g1_8n1I2orsgEXBkAEsLF4pPw1_LuWZWZ1ORfU8kNUMuQxJsg

[^设置 RDP 客户端以连接到 Jetson Nano。]:

根据自己的喜好配置设置后,您可能希望关闭“全屏启动会话”,并为生成的窗口桌面设置合理的分辨率。单击“保存”,然后单击“Jetson Nano”桌面图标打开RDP桌面。

当您使用 RDP 连接到主板时, 桌面看起来会有所不同。这是因为您将看到一个标准的Ubuntu桌面,运行Gnome,而不是L4T上默认的旧Unity风格桌面。

image.png

image.png
image.png

[^连接到外观略有不同的桌面。]:

⚠️警告 您无法在物理桌面上登录并打开 RDP 桌面,相反,如果您已经打开了 RDP 桌面,则无法登录到物理桌面。如果您打开了 RDP 桌面并尝试使用 VNC 连接到 Jetson Nano,您将连接到 RDP 会话。

如果您在使用远程桌面时习惯了VNC,则应牢记其中的差异。您没有查看现有的 Jetson Nano 桌面,而是在创建另一个桌面。该虚拟桌面将一直存在,直到您注销为止,就像您坐在物理键盘前一样。如果您只是关闭 RDP 窗口并走开,则不会关闭桌面或注销。下次连接到 Jetson Nano 上的 RDP 服务器时,RDP 桌面看起来将相同。

最后,如果您已经摆脱了以太网电缆,并且依靠无线网络连接到Jetson Nano,则应打开新的Gnome“设置”应用程序,从左侧菜单中选择“电源”,并确保关闭“关闭Wi-Fi以节省电源”。

1_LzWZ-6f-LCJVkr65ciu14g

[^您需要确保无线连接未关闭以节省电量。]:

Jetson Nano现在可以在无头模式下运行。您可以拔下显示器键盘鼠标,您将不再需要它们。

设置 NVIDIA TensorRT

与Coral Dev Board不同,Coral Dev Board预装了一个非常光滑的初始演示应用程序,该应用程序可以启动一个Web服务器,其中包含高速公路流量的视频流,并在顶部覆盖板上完成实时推理,Jetson Nano在默认图像中不附带任何演示应用程序。

但是,您可以从该项目的GitHub存储库下载一个广泛的第一个演示,称为“Hello AI World*”。*但是,在我们看一下之前,您需要确保的第一件事是安装并已安装。cmake``git

$ sudo apt-get install cmake
$ sudo apt-get install git

然后,我们可以克隆存储库,并配置子模块。

$ git clone https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ git submodule update --init

然后构建源代码,

$ mkdir build
$ cd build
$ cmake ../
$ make
$ sudo make install

这将需要一段时间。也许是时候喝杯咖啡了?

运行您的第一个机器学习模型

现在我们已经构建了演示应用程序,我们可以运行我们的第一个模型。如果您继续将目录更改为目录,则可以运行随附的演示应用程序。这将接受图像作为输入,并输出检测到的边界框的坐标列表。需要将预先训练的模型指定为第三个参数。build``detectnet-console

$ cd ~/jetson-inference/build/aarch64/bin
$ ./detectnet-console ~/dog.jpg out.jpg coco-dog

⚠️警告 首次运行演示应用程序时,TensorRT 可能需要“最多几分钟”来优化网络。虽然优化的网络文件在第一次使用时就会缓存到磁盘上,并且下次事情会运行得更快,但他们并不是在开玩笑。第一次运行模型时,您可能会认为代码已挂起并且不起作用。我知道我做到了,因为它不仅仅是“几分钟”。

在使用COCO训练的DetecNet Caffe模型中,抛出我的狗在沙滩上玩耍的图像,即“上下文中的常见对象”数据集,我最终得到了一个非常可靠的检测和一个好的边界框。

1 bounding boxes detected
detected obj 0 class #0 (dog) confidence=0.710427
bounding box 0 (334.687500, 488.742188) (1868.737549, 2298.121826) w=1534.050049 h=1809.379639

考虑到他或多或少地面对着镜头,并且最近浸入大海时浑身湿透,我实际上对这里的输出相当满意。

1_fjAcVgO5v_2z5b_-cqgPzg1_pbI4btmCmhE_5UikHiw6dg

[^忠实的猎犬[还球](https://www.instagram.com/p/BnOlRxalgnt/)。🎾]:

Jetson Nano还附带了其他几个预先训练的模型,包括那些经过训练以检测图像中的多个人和行李的模型。

1_4mjF2APgZ1mtBDu6jYkyAg

可与 DetectNet 演示应用程序一起使用的其他预训练模型。

我继续将我在CES上拍摄的图像(与我与英特尔神经计算模块2一起使用的图像一样)扔到了预先训练的网络中。

$ ./detectnet-console me.jpg out.jpg facenet

1_3DIIxiyRvW5oActk9xWDHw1_ccipZ4XUlU3jBGXfwQVGGg

[^成功的人脸检测。]:

有趣的是,边界框与我们之前看到的略有不同,并且对检测的信心要低得多。但仍然是一个坚实的检测。

1 bounding boxes detected
detected obj 0  class #0 (face)  confidence=0.604924
bounding box 0  (336.479156, 32.527779)  (441.888885, 199.777786)  w=105.409729  h=167.250000

差异将归结为模型调优,而不是任何其他因素。我的猜测是,Jetson Nano附带的演示模型没有得到很好的调整。

换句话说,它们不是生产质量模型。

考虑到Jetson Nano上的散热器有多大,我有点想看看它现在有多热,我们一直在锻炼它。所以我拿起我的激光红外测温仪检查了一下。

1_qvBH-w_1yqnOOBROfuR-4w

散热器关闭散热器的温度约为 50°C (122°F)。

在电路板运行一段时间后,散热器的温度达到约50°C(122°F)。这类似于我们在Google的Coral Dev Board上看到的。

什么时候香蕉不是香蕉?

在这一点上,我想在NVIDIA硬件上抛出与谷歌的Coral硬件相同的午餐时间水果图像。这次我们将使用演示应用程序。imagenet-console

![1_2Gy35BcbGRjUlU99xX2qrQ](C:\Users\萧\Pictures\学习\1_2Gy35BcbGRjUlU99xX2qrQ.jpeg)$ ~/jetson-inference/build/aarch64/bin
$ ./imagenet-console ~/fruit.jpg out.jpg

虽然它检测到香蕉,但它并没有真正做得很好。

1_2Gy35BcbGRjUlU99xX2qrQ1_hCASvn2b4TLUOOaOpo9kEA

[^用Jetson Nano检测水果。]:

所以我又向它扔了几张不同水果的图片,我得到了类似的,在某些情况下,有时结果要差得多。对于包含的影像,样本网络表现良好,但对于真实世界的影像,则表现非常差(在某些情况下是灾难性的)。这里的解释是,这个模型已经过训练来对图像进行分类,而不是检测物体。这是一项非常不同的工作。值得注意的是,所包含的与水果相关的图像都具有白色或中性背景。实际上,网络在说“…这是香蕉的图像“而不是”…这就是图像中香蕉的位置

请务必阅读文档,它可以提供帮助。

编写自己的对象识别代码

编写自己的对象识别代码实际上并不难,即使在C++也可以以相当紧凑的方式完成,如果你不试图围绕分类任务做任何复杂的事情。

// Object Recognition example code from NVIDIA
// See https://github.com/dusty-nv/jetson-inference/blob/master/examples/my-recognition/my-recognition.cpp

#include <jetson-inference/imageNet.h>
#include <jetson-utils/loadImage.h>

int main( int argc, char** argv ){
	if( argc < 2 ) {
		printf("object_recognition:  expected image filename as argument\n");
		printf("example usage:   ./object_recognition image.jpg\n");
		return 0;
	}

	const char* imgFilename = argv[1];
	float* imgCPU    = NULL;		
	float* imgCUDA   = NULL;		
	int    imgWidth  = 0;		
	int    imgHeight = 0;	
		
	if( !loadImageRGBA(imgFilename, (float4**)&imgCPU, (float4**)&imgCUDA, &imgWidth, &imgHeight) ) {
		printf("failed to load image '%s'\n", imgFilename);
		return 0;
	}

	imageNet* net = imageNet::Create(imageNet::GOOGLENET);
	if( !net ) {
		printf("failed to load image recognition network\n");
		return 0;
	}

	float confidence = 0.0;
	const int classIndex = net->Classify(imgCUDA, imgWidth, imgHeight, &confidence);

	if( classIndex >= 0 ) {
		const char* classDescription = net->GetClassDesc(classIndex);
		printf("image is recognized as '%s' (class #%i) with %f%% confidence\n", 
			  classDescription, classIndex, confidence * 100.0f);
	} else {
		printf("failed to classify image\n");
	}
  
	delete net;
	return 0;
}

您可以使用 从命令行获取代码和关联的生成文件,然后按如下所示生成它。wget

$ cd ~
$ mkdir object_recognition
$ wget https://gist.githubusercontent.com/aallan/4de3a74676d4ff10a476c2d6c20b9255/raw/818eb292805520a9fc01aaaee2f7a5692cdf1f92/object_recognition.cpp
$ wget https://gist.githubusercontent.com/aallan/9945105f8ae2aed47d96e23adb8dddc1/raw/fef4e1249de9f4be6763e40cfcd8e1a7b92a40d4/CMakeLists.txt
$ cmake .
$ make

该代码将加载与我们之前看到的演示应用程序相同的GoogleNet模型,但这次只会将确定性和分类输出到控制台。imagenet-console

1_AXN2zhVzLmexorTr8yYIRw

芬兰的北极熊。

我对我在芬兰拍摄的一组北极熊图像进行了测试,即使给定阴影,大多数图像也获得了非常好的分类结果。

class 0150 - 0.010576  (sea lion)
class 0181 - 0.020546  (Bedlington terrier)
class 0182 - 0.012807  (Border terrier)
class 0279 - 0.010743  (Arctic fox, white fox, Alopex lagopus)
class 0294 - 0.014232  (brown bear, bruin, Ursus arctos)
class 0296 - 0.741458  (ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus)
class 0360 - 0.089249  (otter)
image is recognized as 'ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus' (class #296) with 74.145813% confidence

虽然一些图像确实返回了较差的结果,但其中大多数是北极熊幼崽。同样,这可能归结为模型调优和模型的初始训练数据。

Python 支持 Jetson Nano?

如果您有兴趣在C++中使用Jetson Nano,我强烈建议您查看NVIDIA的“Hello AI World”教程。然而,对于我自己来说,我真的宁愿在Python中工作。幸运的是,Jetson Nano有一个官方的TensorFlow版本。不幸的是,如果可以预见,在这里我们遇到了安装说明的问题

永远不要更换使用的系统,这是一种破坏行为。pip``pip

避免明显的陷阱,安装并不是那么糟糕,只是相当长。但是,首先,您需要安装一些依赖项。

$ sudo apt-get install libhdf5-serial-dev hdf5-tools
$ sudo apt-get install python3-pip
$ sudo apt-get install zlib1g-dev zip libjpeg8-dev libhdf5-dev 
$ pip3 install -U numpy grpcio absl-py py-cpuinfo psutil portpicker grpcio six mock requests gast h5py astor termcolor

在所有这些安装完毕之后,只有这样你才应该继续安装TensorFlow。虽然您可以根据需要安装特定版本,但以下版本应安装最新的可用版本。

$ pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu

您可以通过放入Python并尝试使用TensorFlow模块来验证TensorFlow是否已正确安装,import

$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>>

如果您没有看到任何错误,则TensorFlow已正确安装。

这些转到十一?

您可能已经注意到,您可以使用微型USB连接器或桶形插孔通过跳线为Jetson Nano供电。关闭J48会将微型USB插孔的电源切换到桶形插孔。J48

1_RF4leCdUln6IxHqzftBcww

[^关闭跳线 。J48]:

如果您使用4A电源从桶形插孔为电路板供电,则可以启用“最高性能模型”,并且事情应该运行得更快。

sudo nvpmodel -m 0

但我想,如果你只在需要额外的推动力时才这样做,越过悬崖

⚠️警告 不要启用“最大性能模型”,除非您已将主板切换为使用桶形插孔并具有足够可靠的电源。如果您在电路板上启用最大性能,则不太可能找到不会导致欠压事件的微型USB电源。

总结

NVIDIA 使设置变得比必要的困难得多。对于一个据说是用于边缘的硬件,相当奇怪的是,你需要一张桌子来放置显示器键盘鼠标,以便设置电路板。我猜这说明了NVIDIA的传统,他们更习惯于构建台式计算机或机架式服务器,而不是嵌入式设备。

然而,这并不是他们Linux发行版的可怕状态的任何借口。它在设置和完成工作期间造成的痛苦程度都过大。我不认为我已经在Linux发行版上如此努力地挣扎,让它在几年内完成我想要它做的事情。

Jetson 文档的状态并不像英特尔神经计算模块的文档那样糟糕,但它有些庞大,很难跟踪您应该阅读哪一点。然而,其中一些非常好。

有几个很好的资源集合,我真的不能推荐他们的深度视觉教程“Hello AI World”,更高度。如果您想将C++与Jetson Nano配合使用,这是一个令人惊叹的起点。

但是,就像【英特尔神经计算棒】一样,NVIDIA硬件的开箱即用体验是使用C++而不是Python。虽然我能理解他们的推理,以及导致他们到达那里的历史,但我认为这是他们的一个糟糕的决定。他们应该以机器学习开发人员和数据科学家熟悉的环境为主导,对于机器学习来说,那就是Python,TensorFlow和Jupyter notebooks

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。