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


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

Стандартный радиатор хорошо справляется с охлаждением платы, и типичные нагрузочные тесты процессора не приводят к дросселированию процессора. Поэтому, нам пришлось обратить внимание и на графический процессор, поскольку для его настройки требуются некоторые усилия. Расскажем вам о нашем опыте настройки платы и запуска программ тестирования AI, включая запуск обнаружения объектов в видеопотоке RTSP.

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

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

  1. Загрузите последнюю версию прошивки (на момент написания обзора, это nv-jetson-nano-sd-card-image-r32.2.3.zip )
  2. Перепишите его с помощью balenaEtcher на карту MicroSD, поскольку в комплекте разработчика Jetson Nano нет встроенной памяти.
  3. Вставьте карту 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 в двух частях файла:

  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 ; 

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.

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

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

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

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