В прошлом месяце мы получили комплект разработчика NVIDIA Jetson Nano вместе с охлаждающим вентилятором 52Pi ICE Tower, и основная цель состояла в том, чтобы сравнить производительность платы со стандартным теплоотводом или комбинированным — радиатором 52Pi + вентилятор.
Стандартный радиатор хорошо справляется с охлаждением платы, и типичные нагрузочные тесты процессора не приводят к дросселированию процессора. Поэтому, нам пришлось обратить внимание и на графический процессор, поскольку для его настройки требуются некоторые усилия. Расскажем вам о нашем опыте настройки платы и запуска программ тестирования AI, включая запуск обнаружения объектов в видеопотоке RTSP.
Настройка платы NVIDIA Jetson Nano
Подготовка платы очень похожа на то, что вы делаете с другими SBC, такими как Raspberry Pi, и у NVIDIA есть хорошее руководство по началу работы, поэтому мы не будем вдаваться в подробности. Обобщим:
- Загрузите последнюю версию прошивки (на момент написания обзора, это nv-jetson-nano-sd-card-image-r32.2.3.zip )
- Перепишите его с помощью balenaEtcher на карту MicroSD, поскольку в комплекте разработчика Jetson Nano нет встроенной памяти.
- Вставьте карту MicroSD в слот под модулем, подключите HDMI, клавиатуру и мышь, прежде чем, наконец, включить плату
По умолчанию плата рассчитана на питание от источника 5 В через порт micro USB. Но, чтобы избежать возможных проблем с питанием, мы подключили источник питания 5 В/3 А к разъему постоянного тока и установили джампер на разъеме J48 для переключения источника питания.

Плата быстро загрузилась в Ubuntu, и, после прохождения мастера настройки, чтобы принять пользовательское соглашение, выбрать язык, раскладку клавиатуры, часовой пояс и настроить пользователя, система выполнила некоторые настройки, и через пару минут мы были готовы идти.

Информация о системе Jetson Nano и инструменты NVIDIA
Вот некоторая информация о системе после обновления Ubuntu с помощью dist-upgrade:
cnxsoft@Jetson-Nano:~$ uname -a
Linux Jetson-Nano 4.9.140-tegra #1 SMP PREEMPT Tue Nov 5 13:43:53 PST 2019 aarch64 aarch64 aarch64 GNU/Linux
cnxsoft@Jetson-Nano:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
cnxsoft@Jetson-Nano:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mmcblk0p1 30G 10G 18G 36% /
none 1.7G 0 1.7G 0% /dev
tmpfs 2.0G 4.0K 2.0G 1% /dev/shm
tmpfs 2.0G 30M 2.0G 2% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
tmpfs 396M 20K 396M 1% /run/user/120
tmpfs 396M 136K 396M 1% /run/user/1000
cnxsoft@Jetson-Nano:~$ free -h
total used free shared buff/cache available
Mem: 3.9G 1.7G 449M 49M 1.8G 2.0G
Swap: 1.9G 904K 1.9G
cnxsoft@Jetson-Nano:~$ cat /proc/cpuinfo
processor : 0
model name : ARMv8 Processor rev 1 (v8l)
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x1
CPU part : 0xd07
CPU revision : 1
processor : 1
model name : ARMv8 Processor rev 1 (v8l)
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x1
CPU part : 0xd07
CPU revision : 1
Загруженные модули:
lsmod
Module Size Used by
bnep 16562 2
zram 26166 4
overlay 48691 0
fuse 103841 5
nvgpu 1569917 38
bluedroid_pm 13912 0
ip_tables 19441 0
x_tables 28951 1 ip_tables
GPIO, кажется, правильно настроен:
cat /sys/kernel/debug/gpio
cat: /sys/kernel/debug/gpio: Permission denied
cnxsoft@Jetson-Nano:~$ sudo cat /sys/kernel/debug/gpio
[sudo] password for cnxsoft:
gpiochip0: GPIOs 0-255, parent: platform/6000d000.gpio, tegra-gpio:
gpio-0 ( )
gpio-1 ( )
gpio-2 ( |pcie_wake ) in hi
gpio-3 ( )
gpio-4 ( )
gpio-5 ( )
gpio-6 ( |vdd-usb-hub-en ) out hi
gpio-7 ( )
gpio-8 ( )
gpio-9 ( )
gpio-10 ( )
gpio-11 ( )
gpio-12 (SPI1_MOSI )
gpio-13 (SPI1_MISO )
gpio-14 (SPI1_SCK )
gpio-15 (SPI1_CS0 )
gpio-16 (SPI0_MOSI )
gpio-17 (SPI0_MISO )
gpio-18 (SPI0_SCK )
gpio-19 (SPI0_CS0 )
gpio-20 (SPI0_CS1 )
gpio-21 ( )
gpio-22 ( )
gpio-23 ( )
gpio-24 ( )
gpio-25 ( )
gpio-26 ( )
gpio-27 ( )
gpio-28 ( )
gpio-29 ( )
gpio-30 ( )
gpio-31 ( )
gpio-32 ( )
gpio-33 ( )
gpio-34 ( )
gpio-35 ( )
gpio-36 ( )
gpio-37 ( )
gpio-38 (GPIO13 )
gpio-39 ( )
gpio-40 ( )
gpio-41 ( )
gpio-42 ( )
gpio-43 ( )
gpio-44 ( )
gpio-45 ( )
gpio-46 ( )
gpio-47 ( )
gpio-48 ( )
gpio-49 ( )
gpio-50 (UART1_RTS )
gpio-51 (UART1_CTS )
gpio-52 ( )
gpio-53 ( )
gpio-54 ( )
gpio-55 ( )
gpio-56 ( )
gpio-57 ( )
gpio-58 ( )
gpio-59 ( )
gpio-60 ( )
gpio-61 ( )
gpio-62 ( )
gpio-63 ( )
gpio-64 ( )
gpio-65 ( )
gpio-66 ( )
gpio-67 ( )
gpio-68 ( )
gpio-69 ( )
gpio-70 ( )
gpio-71 ( )
gpio-72 ( )
gpio-73 ( )
gpio-74 ( )
gpio-75 ( )
gpio-76 (I2S0_FS )
gpio-77 (I2S0_DIN )
gpio-78 (I2S0_DOUT )
gpio-79 (I2S0_SCLK )
gpio-80 ( )
gpio-81 ( )
gpio-82 ( )
gpio-83 ( )
gpio-84 ( )
gpio-85 ( )
gpio-86 ( )
gpio-87 ( )
gpio-88 ( )
gpio-89 ( )
gpio-90 ( )
gpio-91 ( )
gpio-92 ( )
gpio-93 ( )
gpio-94 ( )
gpio-95 ( )
gpio-96 ( )
gpio-97 ( )
gpio-98 ( )
gpio-99 ( )
gpio-100 ( )
gpio-101 ( )
gpio-102 ( )
gpio-103 ( )
gpio-104 ( )
gpio-105 ( )
gpio-106 ( )
gpio-107 ( )
gpio-108 ( )
gpio-109 ( )
gpio-110 ( )
gpio-111 ( )
gpio-112 ( )
gpio-113 ( )
gpio-114 ( )
gpio-115 ( )
gpio-116 ( )
gpio-117 ( )
gpio-118 ( )
gpio-119 ( )
gpio-120 ( )
gpio-121 ( )
gpio-122 ( )
gpio-123 ( )
gpio-124 ( )
gpio-125 ( )
gpio-126 ( )
gpio-127 ( )
gpio-128 ( )
gpio-129 ( )
gpio-130 ( )
gpio-131 ( )
gpio-132 ( )
gpio-133 ( )
gpio-134 ( )
gpio-135 ( )
gpio-136 ( )
gpio-137 ( )
gpio-138 ( )
gpio-139 ( )
gpio-140 ( )
gpio-141 ( )
gpio-142 ( )
gpio-143 ( )
gpio-144 ( )
gpio-145 ( )
gpio-146 ( )
gpio-147 ( )
gpio-148 ( )
gpio-149 (GPIO01 )
gpio-150 ( )
gpio-151 ( |cam_reset_gpio ) out lo
gpio-152 ( |camera-control-outpu) out lo
gpio-153 ( )
gpio-154 ( )
gpio-155 ( )
gpio-156 ( )
gpio-157 ( )
gpio-158 ( )
gpio-159 ( )
gpio-160 ( )
gpio-161 ( )
gpio-162 ( )
gpio-163 ( )
gpio-164 ( )
gpio-165 ( )
gpio-166 ( )
gpio-167 ( )
gpio-168 (GPIO07 )
gpio-169 ( )
gpio-170 ( )
gpio-171 ( )
gpio-172 ( )
gpio-173 ( )
gpio-174 ( )
gpio-175 ( )
gpio-176 ( )
gpio-177 ( )
gpio-178 ( )
gpio-179 ( )
gpio-180 ( )
gpio-181 ( )
gpio-182 ( )
gpio-183 ( )
gpio-184 ( )
gpio-185 ( )
gpio-186 ( )
gpio-187 ( |? ) out hi
gpio-188 ( )
gpio-189 ( |Power ) in hi IRQ
gpio-190 ( |Forcerecovery ) in hi IRQ
gpio-191 ( )
gpio-192 ( )
gpio-193 ( )
gpio-194 (GPIO12 )
gpio-195 ( )
gpio-196 ( )
gpio-197 ( )
gpio-198 ( )
gpio-199 ( )
gpio-200 (GPIO11 )
gpio-201 ( |cd ) in lo IRQ
gpio-202 ( |pwm-fan-tach ) in hi IRQ
gpio-203 ( |vdd-3v3-sd ) out hi
gpio-204 ( )
gpio-205 ( )
gpio-206 ( )
gpio-207 ( )
gpio-208 ( )
gpio-209 ( )
gpio-210 ( )
gpio-211 ( )
gpio-212 ( )
gpio-213 ( )
gpio-214 ( )
gpio-215 ( )
gpio-216 (GPIO09 )
gpio-217 ( )
gpio-218 ( )
gpio-219 ( )
gpio-220 ( )
gpio-221 ( )
gpio-222 ( )
gpio-223 ( )
gpio-224 ( )
gpio-225 ( |hdmi2.0_hpd ) in lo IRQ
gpio-226 ( )
gpio-227 ( )
gpio-228 ( |extcon:extcon@1 ) in hi IRQ
gpio-229 ( )
gpio-230 ( )
gpio-231 ( )
gpio-232 (SPI1_CS1 )
gpio-233 ( )
gpio-234 ( )
gpio-235 ( )
gpio-236 ( )
gpio-237 ( )
gpio-238 ( )
gpio-239 ( )
gpiochip1: GPIOs 504-511, parent: platform/max77620-gpio, max77620-gpio, can sleep:
gpio-505 ( |spmic-default-output) out hi
gpio-507 ( |vdd-3v3-sys ) out hi
gpio-510 ( |enable ) out lo
gpio-511 ( |avdd-io-edp-1v05 ) out lo
Nvidia Power Model Tool позволяет нам проверить режим питания:
sudo nvpmodel -q
NVPM WARN: fan mode is not set!
NV Power Mode: MAXN
0
MAXN — это режим мощности 10 Вт. Мы можем изменить его на 5 Вт и проверить его следующим образом:
sudo nvpmodel -m 1
sudo nvpmodel -q
NVPM WARN: fan mode is not set!
NV Power Mode: 5W
1
NVIDIA также предоставляет утилиту tegrastats, которая сообщает в реальном времени о загруженности, температуре и потреблении энергии различными частями процессора:
tegrastats
RAM 1802/3956MB (lfb 106x4MB) SWAP 0/1978MB (cached 0MB) CPU [12%@102,6%@102,off,off] EMC_FREQ 0% GR3D_FREQ 0% PLL@34C CPU@35C PMIC@100C GPU@36C AO@44.5C thermal@35.5C POM_5V_IN 1121/1121 POM_5V_GPU 0/0 POM_5V_CPU 124/124
RAM 1802/3956MB (lfb 106x4MB) SWAP 0/1978MB (cached 0MB) CPU [14%@102,4%@102,off,off] EMC_FREQ 0% GR3D_FREQ 0% PLL@34C CPU@35.5C PMIC@100C GPU@36C AO@45C thermal@35.5C POM_5V_IN 1079/1100 POM_5V_GPU 0/0 POM_5V_CPU 124/124
RAM 1802/3956MB (lfb 105x4MB) SWAP 0/1978MB (cached 0MB) CPU [17%@307,6%@307,off,off] EMC_FREQ 0% GR3D_FREQ 0% PLL@34C CPU@35C PMIC@100C GPU@36C AO@44.5C thermal@35.75C POM_5V_IN 1121/1107 POM_5V_GPU 0/0 POM_5V_CPU 165/137
RAM 1802/3956MB (lfb 105x4MB) SWAP 0/1978MB (cached 0MB) CPU [14%@102,5%@102,off,off] EMC_FREQ 0% GR3D_FREQ 0% PLL@34C CPU@35C PMIC@100C GPU@36C AO@45C thermal@35.5C POM_5V_IN 1121/1110 POM_5V_GPU 0/0 POM_5V_CPU 166/144
RAM 1802/3956MB (lfb 105x4MB) SWAP 0/1978MB (cached 0MB) CPU [14%@102,4%@102,off,off] EMC_FREQ 0% GR3D_FREQ 0% PLL@34C CPU@35C PMIC@100C GPU@36C AO@44.5C thermal@35.5C POM_5V_IN 1121/1112 POM_5V_GPU 0/0 POM_5V_CPU 165/148
RAM 1802/3956MB (lfb 105x4MB) SWAP 0/1978MB (cached 0MB) CPU [15%@204,5%@204,off,off] EMC_FREQ 0% GR3D_FREQ 0% PLL@34C CPU@35C PMIC@100C GPU@36C AO@45C thermal@35.5C POM_5V_IN 1121/1114 POM_5V_GPU 0/0 POM_5V_CPU 166/151
RAM 1802/3956MB (lfb 105x4MB) SWAP 0/1978MB (cached 0MB) CPU [14%@204,3%@204,off,off] EMC_FREQ 0% GR3D_FREQ 0% PLL@34C CPU@35C PMIC@100C GPU@36C AO@45C thermal@35.5C POM_5V_IN 1161/1120 POM_5V_GPU 0/0 POM_5V_CPU 165/153
RAM 1802/3956MB (lfb 105x4MB) SWAP 0/1978MB (cached 0MB) CPU [16%@102,6%@102,off,off] EMC_FREQ 0% GR3D_FREQ 0% PLL@34C CPU@35C PMIC@100C GPU@36C AO@45C thermal@35.5C POM_5V_IN 1163/1126 POM_5V_GPU 0/0 POM_5V_CPU 165/155
Звучит довольно странно, так что вы можете проверить документацию . Например, на холостом ходу, как показано выше, у нас используется два ядра на частоте всего 102 МГц, температура процессора составляет около 35 ° C, графический процессор в основном не используется, а энергопотребление платы составляет около 1,1 Вт.
AI Hello World
Лучший способ начать работу с выводами AI — использовать образцы Hello World, которые устанавливаются следующим образом:
sudo apt update
sudo apt install git cmake libpython3 - dev python3 - numpy dialog
git clone -- recursive https : // github .com / dusty - nv / jetson - inference
cd jetson - inference
mkdir build
< span class = "pl-c1" > cd < / span > build
cmake . . /
Последняя команда выведет диалоговое окно Hello AI World для выбора моделей, которые вы хотели бы использовать. Мы использовали установленные по умолчанию

После загрузки выбранных моделей вам будет задан вопрос, хотите ли вы установить PyTorch:

Если вы собираетесь воспользоваться только предварительно обученными моделями, устанавливать его не нужно, но мы выбрали PyTorch v1.1.10 для Python 2.7 на тот случай, если у нас будет время попробовать обучение.
Теперь мы можем построить образец:
make
sudo make install
sudo ldconfig
Затем сверьте вывод изображения с образцом изображения, используя ImageNet:
cd ~jetson-inference/build/aarch64/bin
./imagenet-console --network=googlenet images/orange_0.jpg output_0.jpg
Вот вывод последней команды:
imageNet -- loading classification network model from:
-- prototxt networks/googlenet.prototxt
-- model networks/bvlc_googlenet.caffemodel
-- class_labels networks/ilsvrc12_synset_words.txt
-- input_blob 'data'
-- output_blob 'prob'
-- batch_size 1
[TRT] TensorRT version 5.1.6
[TRT] loading NVIDIA plugins...
[TRT] Plugin Creator registration succeeded - GridAnchor_TRT
[TRT] Plugin Creator registration succeeded - NMS_TRT
[TRT] Plugin Creator registration succeeded - Reorg_TRT
[TRT] Plugin Creator registration succeeded - Region_TRT
[TRT] Plugin Creator registration succeeded - Clip_TRT
[TRT] Plugin Creator registration succeeded - LReLU_TRT
[TRT] Plugin Creator registration succeeded - PriorBox_TRT
[TRT] Plugin Creator registration succeeded - Normalize_TRT
[TRT] Plugin Creator registration succeeded - RPROI_TRT
[TRT] Plugin Creator registration succeeded - BatchedNMS_TRT
[TRT] completed loading NVIDIA plugins.
[TRT] detected model format - caffe (extension '.caffemodel')
[TRT] desired precision specified for GPU: FASTEST
[TRT] requested fasted precision for device GPU without providing valid calibrator, disabling INT8
[TRT] native precisions detected for GPU: FP32, FP16
[TRT] selecting fastest native precision for GPU: FP16
[TRT] attempting to open engine cache file networks/bvlc_googlenet.caffemodel.1.1.GPU.FP16.engine
[TRT] loading network profile from engine cache... networks/bvlc_googlenet.caffemodel.1.1.GPU.FP16.engine
[TRT] device GPU, networks/bvlc_googlenet.caffemodel loaded
[TRT] device GPU, CUDA engine context initialized with 2 bindings
[TRT] binding -- index 0
-- name 'data'
-- type FP32
-- in/out INPUT
-- # dims 3
-- dim #0 3 (CHANNEL)
-- dim #1 224 (SPATIAL)
-- dim #2 224 (SPATIAL)
[TRT] binding -- index 1
-- name 'prob'
-- type FP32
-- in/out OUTPUT
-- # dims 3
-- dim #0 1000 (CHANNEL)
-- dim #1 1 (SPATIAL)
-- dim #2 1 (SPATIAL)
[TRT] binding to input 0 data binding index: 0
[TRT] binding to input 0 data dims (b=1 c=3 h=224 w=224) size=602112
[TRT] binding to output 0 prob binding index: 1
[TRT] binding to output 0 prob dims (b=1 c=1000 h=1 w=1) size=4000
device GPU, networks/bvlc_googlenet.caffemodel initialized.
[TRT] networks/bvlc_googlenet.caffemodel loaded
imageNet -- loaded 1000 class info entries
networks/bvlc_googlenet.caffemodel initialized.
[image] loaded 'images/orange_0.jpg' (1920 x 1920, 3 channels)
class 0950 - 0.978582 (orange)
class 0951 - 0.021285 (lemon)
imagenet-console: 'images/orange_0.jpg' -> 97.85821% class #950 (orange)
[TRT] ------------------------------------------------
[TRT] Timing Report networks/bvlc_googlenet.caffemodel
[TRT] ------------------------------------------------
[TRT] Pre-Process CPU 0.08693ms CUDA 0.87870ms
[TRT] Network CPU 64.90576ms CUDA 63.73557ms
[TRT] Post-Process CPU 0.25339ms CUDA 0.25224ms
[TRT] Total CPU 65.24608ms CUDA 64.86651ms
[TRT] ------------------------------------------------
[TRT] note -- when processing a single image, run 'sudo jetson_clocks' before
to disable DVFS for more accurate profiling/timing measurements
imagenet-console: attempting to save output image to 'output_0.jpg'
imagenet-console: completed saving 'output_0.jpg'
imagenet-console: shutting down...
imagenet-console: shutdown complete
Также был сгенерирован output_0.jpg с информацией вывода «97.858 orange», наложенной поверх изображения.
Tiny YOLO-v3
Образец imageNet не занимает много времени, поэтому мы также попробовали образец Tiny-Yolo3, который имеет 500 изображений, как описано в сообщении на форуме :
sudo apt install libgstreamer - plugins - base1 . 0 - dev libgstreamer1 . 0 - dev libgflags - dev
cd ~
git clone - b restructure https : // github .com / NVIDIA - AI - IOT / deepstream_reference_apps
cd ~ / deepstream_reference_apps / yolo
sudo sh prebuild .sh
cd apps / trt - yolo
mkdir build && cd build
cmake - D CMAKE_BUILD_TYPE = Release . .
make
sudo make install
После того, как мы создали образец, у нас есть еще немного работы. Сначала мы скачали из сети 5 изображений с типичными объектами:
ls ~/Pictures/
bicycle.jpg bus.jpg car.jpg laptop.jpg raspberry-pi-4.jpg
отредактировали ~ / deepstream_reference_apps / yolo / data / test_images.txt, чтобы повторить ниже 5 строк 100 раз, чтобы получить 500 записей:
/home/cnxsoft/Pictures/laptop.jpg
/home/cnxsoft/Pictures/raspberry-pi-4.jpg
/home/cnxsoft/Pictures/bicycle.jpg
/home/cnxsoft/Pictures/bus.jpg
/home/cnxsoft/Pictures/car.jpg
и, наконец, изменили ~ / deepstream_reference_apps / yolo / config / yolov3-tiny.txt для использования точности kHALF:
--precision=kHALF
Теперь мы можем запустить вывод Tiny YOLO
cd ~/deepstream_reference_apps/yolo
sudo trt-yolo-app --flagfile=config/yolov3-tiny.txt
Это вывод (не первый запуск):
sudo trt-yolo-app --flagfile=config/yolov3-tiny.txt
[sudo] password for cnxsoft:
Loading pre-trained weights...
Loading complete!
Total Number of weights read : 8858734
layer inp_size out_size weightPtr
(1) conv-bn-leaky 3 x 416 x 416 16 x 416 x 416 496
(2) maxpool 16 x 416 x 416 16 x 208 x 208 496
(3) conv-bn-leaky 16 x 208 x 208 32 x 208 x 208 5232
(4) maxpool 32 x 208 x 208 32 x 104 x 104 5232
(5) conv-bn-leaky 32 x 104 x 104 64 x 104 x 104 23920
(6) maxpool 64 x 104 x 104 64 x 52 x 52 23920
(7) conv-bn-leaky 64 x 52 x 52 128 x 52 x 52 98160
(8) maxpool 128 x 52 x 52 128 x 26 x 26 98160
(9) conv-bn-leaky 128 x 26 x 26 256 x 26 x 26 394096
(10) maxpool 256 x 26 x 26 256 x 13 x 13 394096
(11) conv-bn-leaky 256 x 13 x 13 512 x 13 x 13 1575792
(12) maxpool 512 x 13 x 13 512 x 13 x 13 1575792
(13) conv-bn-leaky 512 x 13 x 13 1024 x 13 x 13 6298480
(14) conv-bn-leaky 1024 x 13 x 13 256 x 13 x 13 6561648
(15) conv-bn-leaky 256 x 13 x 13 512 x 13 x 13 7743344
(16) conv-linear 512 x 13 x 13 255 x 13 x 13 7874159
(17) yolo 255 x 13 x 13 255 x 13 x 13 7874159
(18) route - 256 x 13 x 13 7874159
(19) conv-bn-leaky 256 x 13 x 13 128 x 13 x 13 7907439
(20) upsample 128 x 13 x 13 128 x 26 x 26 -
(21) route - 384 x 26 x 26 7907439
(22) conv-bn-leaky 384 x 26 x 26 256 x 26 x 26 8793199
(23) conv-linear 256 x 26 x 26 255 x 26 x 26 8858734
(24) yolo 255 x 26 x 26 255 x 26 x 26 8858734
Output blob names :
yolo_17
yolo_24
Using previously generated plan file located at data/yolov3-tiny-kHALF-kGPU-batch1.engine
Loading TRT Engine...
Loading Complete!
Total number of images used for inference : 500
[======================================================================] 100 %
Network Type : yolov3-tiny Precision : kHALF Batch Size : 1 Inference time per image : 30.7016 ms
Этот образец используется только для теста, и для каждого логического вывода потребовалось 30,70 мс, поэтому мы имеем скорость вывода около 32 кадров в секунду. Этот образец не сообщает данные о выводе и ничего не отображает на дисплее.
Обнаружение объектов из потока RTSP
Теоретически, мы могли бы зациклить образец Tiny Yolov3 для стресс-тестирования, но чтобы постоянно нагружать GPU, лучше всего сделать вывод на видеопотоке. Часть образца Detenet-Camera из Jetson Inference (известная как AI Hello World) может выполнять эту работу, если у вас есть совместимая USB-камера.

У нас есть две старые веб-камеры, которые мы купили 10-15 лет назад. Нам никогда не удавалось заставить Logitech Quickcam работать в Linux или Android, но раньше мы могли использовать меньшую камеру «Venus 2.0» в обеих операционных системах. На этот раз нам так и не удалось заставить последнюю работать ни в Jetson Nano, ни в ноутбуке Ubuntu 18.04. Если вы хотите получить камеру MIPI или USB, которая наверняка работает с платой, ознакомьтесь со списком совместимых камер .
Но, потом мы подумали … эй, у нас есть одна камера, которая работает! Веб-камера на ноутбуке. Конечно, мы не можем просто подключить его к плате NVIDIA, и, вместо этого, мы запустили поток H.264 с помощью VLC:
sudo apt install vlc
cvlc v4l2 : /// dev / video0 -- sout '#transcode{vcodec=h264,vb=800,acodec=none}:rtp{sdp=rtsp://:8554/}'
cvlc — это утилита командной строки для VLC. Мы также могли воспроизводить поток на ноутбуке:
cvlc rtsp : // 192.168.1.4 : 8554 /
У нас было отставание около 4 секунд, и мы подумали, что установка опции сетевого кэширования на 200 мс может помочь, но вместо этого, видео было кусками Так что проблема в другом, и у нас не было времени заняться этим. Важной частью является то, что нам удалось заставить поток работать:

Когда мы пытались воспроизвести поток в Jetson Nano с помощью VLC, всплыла ошибка сегментации. Но, давайте не будем зацикливаться на этом, а посмотрим, сможем ли мы сделать detectnet-camera для работы с нашим потоком RTSP.
Кто-то уже делал это несколько месяцев назад, так что это очень помогло. Нам нужно отредактировать исходный код ~ / jetson-inference / build / utils / camera / gstCamera.cpp в двух частях файла:
- Отключите обнаружение камеры CSI в gstCamera::ConvertRGBA:
#if 0
if ( csiCamera ( ) )
#else
if ( 1 )
#endif
{
// MIPI CSI camera is NV12
if ( CUDA_FAILED ( cudaNV12ToRGBA32 ( ( uint8_t * ) input , ( float4 * ) mRGBA [ mLatestRGBA ] , mWidth , mHeight ) ) )
return false ;
2. Жестко запрограммируйте поток RTSP в gstCamera:: buildLaunchStr:
else
{
#if 0
ss < < "v4l2src device=" < < mCameraStr < < " ! " ;
ss < < "video/x-raw, width=(int)" < < mWidth < < ", height=(int)" < < mHeight < < ", " ;
#if NV_TENSORRT_MAJOR >= 5
ss < < "format=YUY2 ! videoconvert ! video/x-raw, format=RGB ! videoconvert !" ;
#else
ss < < "format=RGB ! videoconvert ! video/x-raw, format=RGB ! videoconvert !" ;
#endif
ss < < "appsink name=mysink" ;
#endif
mSource = GST_SOURCE_V4L2 ;
}
#if 1
ss < < "rtspsrc location=rtsp://192.168.1.4:8554/ ! rtph264depay ! h264parse ! omxh264dec ! appsink name=mysink" ;
#endif
mLaunchStr = ss . str ( ) ;
Теперь мы можем восстановить образец и запустить программу:
make
cd aarch64 / bin
. / detectnet - camera - width = 640 - height = 480
и успех! При условии, что мы держим на голове массивный пончик, а Санта-Клаус — плюшевый мишка…

Консоль постоянно обновляется с обнаруженными объектами и отчетом о времени.
2 objects detected
detected obj 0 class #1 (person) confidence=0.729327
bounding box 0 ( 350.284058 , 93.807137 ) ( 640.000000 , 476.335693 ) w = 289.715942 h = 382.528564
detected obj 1 class #88 (teddy bear) confidence=0.854156
bounding box 1 ( 135.627579 , 153.656708 ) ( 464.466187 , 468.515198 ) w = 328.838623 h = 314.858490
[ TRT ] ------------------------------------------------
[ TRT ] Timing Report networks / SSD - Mobilenet - v2 / ssd_mobilenet_v2_coco .uff
[ TRT ] ------------------------------------------------
[ TRT ] Pre - Process CPU 0.36381ms CUDA 0.40844ms
[ TRT ] Network CPU 40.90813ms CUDA 39.29630ms
[ TRT ] Post - Process CPU 0.11625ms CUDA 0.11641ms
[ TRT ] Visualize CPU 0.71480ms CUDA 0.74339ms
[ TRT ] Total CPU 42.10300ms CUDA 40.56453ms
[ TRT ] ------------------------------------------------
Этот пример — хороший способ начать подключать одну или несколько IP-камер к Jetson Nano, чтобы использовать AI для снижения ложных предупреждений вместо примитивного PIR-обнаружения, часто используемого в камерах наблюдения. Мы поговорим подробнее об использовании процессора и графического процессора, а также о тепловых нагрузках в следующем посте.
Нам хотелось бы поблагодарить Seeed Studio за отправку нам комплекта разработчика NVIDIA Jetson Nano для оценки. Комплект продается за 99,00 $ плюс доставка. Кроме того, вы также можете найти плату на Amazon или напрямую у NVIDIA.
Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.