Вывод ИИ с использованием изображений и RTSP-видеопотока на плате разработчика NVIDIA Jetson Nano

В прошлом месяце был получен комплект для разработки NVIDIA Jetson Nano вместе с системой охлаждения 52Pi ICE Tower . Основной задачей было сравнить производительность платы со штатным радиатором и комбинацией радиатора 52Pi с вентилятором.

Штатный радиатор эффективно охлаждает плату, и стандартные стресс-тесты CPU не вызывают снижения частоты процессора. Поэтому потребовалось нагрузить GPU. Учитывая сложность настройки, далее описаны этапы конфигурации платы и запуска тестов ИИ, включая детектирование объектов в RTSP-видеопотоке.

Настройка платы NVIDIA Jetson Nano

Подготовка аналогична другим одноплатным компьютерам (SBC), таким как Raspberry Pi. NVIDIA предоставляет подробное руководство для начинающих , поэтому опустим детали. Кратко:

  1. Загрузить актуальный образ прошивки (на момент обзора: nv-jetson-nano-sd-card-image-r32.2.3.zip)
  2. Записать его на карту MicroSD через balenaEtcher, так как комплект Jetson Nano не имеет встроенного хранилища.
  3. Вставить карту в слот под модулем, подключить HDMI, клавиатуру и мышь, затем включить питание.

По умолчанию питание подаётся через micro USB (5V). Для исключения проблем использован блок питания 5V/3A с подключением через DC-разъём и установкой перемычки на контакты J48.

NVIDIA Jetson Nano DC Jack Power
Увеличить

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

Jetson Nano Ubuntu 18.04 Screenshot

Оригинальный скриншот

Системная информация и инструменты 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 ../

Последняя команда запустит выбор моделей. Использованы модели по умолчанию. Jetson Nano Model Downloader

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

Jetson Nano PyTorch Installer Для предобученных моделей это не обязательно, но выбран 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-камеры.

USB Cameras

Были проверены две старые веб-камеры (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 мс вызвало подтормаживание. Причина не исследовалась — ключевым было функционирование потока.

VLC RTSP Stream Воспроизведение на Jetson Nano через VLC завершалось сегфолтом. Перейдём к настройке detectnet-camera для работы с RTSP.

Решение опубликовано ранее . Правки в ~/jetson-inference/build/utils/camera/gstCamera.cpp:

  1. Отключение детектирования 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 секунды]

  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();

    [Время форматирования: 0.0010 секунды]

После пересборки запуск:

make
cd aarch64/bin
./detectnet-camera -width=640 -height=480

Успех! С учётом, что «пончик» — это рука над головой, а «Санта-Клаус» — плюшевый мишка…

Jetson Nano RTSP Stream Inference

Консоль непрерывно обновляется с детектированными объектами и метриками времени.

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.

Оригинал статьи вы можете прочитать здесь.

0 0 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments