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

Система загрузилась в Ubuntu. После мастера настройки (принятие соглашения, выбор языка, раскладки клавиатуры, часового пояса, создание пользователя) завершилась автоматическая конфигурация. Через несколько минут плата была готова к работе.

Оригинальный скриншот
Системная информация и инструменты 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 — режим 10W. Переключение на 5W и проверка:
sudo nvpmodel -m 1
sudo nvpmodel -q
NVPM WARN: fan mode is not set!
NV Power Mode: 5W
1
Утилита 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 МГц, температура CPU ~35°C, GPU не загружен, потребление ~1.1 Вт.
Hello World для ИИ
Лучший старт для инференса — примеры 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
cd build
cmake ../
Последняя команда запустит выбор моделей. Использованы модели по умолчанию.
После загрузки моделей предложат установить 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-потоке
Для непрерывной нагрузки GPU оптимален инференс видеопотока. Пример detectnet-camera из Jetson Inference (Hello AI World) подходит при наличии совместимой USB-камеры.
Были проверены две старые веб-камеры (10-15 лет). Logitech Quickcam в Linux/Android не заработала, а «Venus 2.0» ранее функционировала, но сейчас не определилась ни на Jetson Nano, ни на Ubuntu 18.04. Совместимые камеры перечислены в списке .
Затем использована встроенная камера ноутбука. Через VLC запущен H.264-поток:
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 секунды. Уменьшение сетевого кэширования (network caching) до 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;
[Время форматирования: 0.0002 секунды]
- Жёсткое указание 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();
[Время форматирования: 0.0010 секунды]
После пересборки запуск:
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 с целью снижения ложных срабатываний (в сравнении с примитивными PIR-датчиками в системах наблюдения). Показатели использования CPU/GPU и температуры — в следующей части.
Благодарим Seeed Studio за предоставленный комплект для разработки NVIDIA Jetson Nano. Плата доступна за $99.00 (плюс доставка), а также на Amazon и на сайте NVIDIA .
Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.