เมื่อเดือนที่แล้วฉันได้รับชุดนักพัฒนา NVIDIA Jetson Nano ร่วมกับ 52Pi ICE Tower Cooling Fan และเป้าหมายหลักคือการเปรียบเทียบประสิทธิภาพของบอร์ดกับฮีทซิงค์สต็อกหรือฮีทซิงค์ 52Pi + พัดลมแบบคอมโบ
แต่ฮีทซิงค์ในสต็อกสามารถระบายความร้อนให้กับบอร์ดได้ดีมาก และการทดสอบ stress ของ CPU ทั่วไปไม่ได้ทำให้โปรเซสเซอร์เร่งความเร็วเลย ดังนั้นฉันจึงต้องเน้น GPU ด้วยเช่นกัน เนื่องจากต้องใช้ความพยายามในการตั้งค่าทั้งหมด ดังนั้นฉันจะรายงานประสบการณ์ของฉันในการกำหนดค่าบอร์ด และใช้งานโปรแกรมทดสอบ 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 แป้นพิมพ์ และเมาส์ ก่อนเปิดเครื่องในที่สุด
โดยค่าเริ่มต้น บอร์ดคาดว่าจะได้รับพลังงานจากแหล่งจ่ายไฟ 5V ผ่านพอร์ต micro USB แต่เพื่อหลีกเลี่ยงปัญหาด้านพลังงานที่อาจเกิดขึ้น ฉันเชื่อมต่อแหล่งจ่ายไฟ 5V/3A เข้ากับแจ็ค DC และติดตั้งจัมเปอร์บนส่วนหัว J48 เพื่อเปลี่ยนแหล่งพลังงาน
มันบูตเข้าสู่ Ubuntu อย่างรวดเร็ว และหลังจากผ่านวิซาร์ดการตั้งค่าเพื่อยอมรับข้อตกลงผู้ใช้ เลือกภาษา เค้าโครงแป้นพิมพ์ เขตเวลา และตั้งค่าผู้ใช้ ระบบทำการกำหนดค่าบางอย่าง และภายในไม่กี่นาที เราก็ทำได้ดี
ข้อมูลระบบ Jetson Nano และ เครื่องมือ NVIDIA
นี่คือข้อมูลระบบบางส่วนหลังจากอัปเดต Ubuntu ด้วย dist-upgrade:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
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 |
โมดูลที่โหลด:
1 2 3 4 5 6 7 8 9 10 |
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 ดูเหมือนจะได้รับการกำหนดค่าอย่างถูกต้อง :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 |
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 ช่วยให้เราสามารถตรวจสอบโหมดพลังงาน:
1 2 3 4 |
sudo nvpmodel -q NVPM WARN: fan mode is not set! NV Power Mode: MAXN 0 |
MAXN คือโหมดพลังงาน 10W และเราสามารถเปลี่ยนเป็น 5W และตรวจสอบได้ดังนี้:
1 2 3 4 5 |
sudo nvpmodel -m 1 sudo nvpmodel -q NVPM WARN: fan mode is not set! NV Power Mode: 5W 1 |
NVIDIA ยังจัดเตรียม tegrastats utility เพื่อรายงานการใช้งานแบบเรียลไทม์ อุณหภูมิ และการใช้พลังงานของส่วนต่างๆ ของโปรเซสเซอร์:
1 2 3 4 5 6 7 8 9 |
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 MHz อุณหภูมิของ CPU อยู่ที่ประมาณ 35°C โดยพื้นฐานแล้ว GPU นั้นไม่ได้ใช้งาน และการใช้พลังงานของบอร์ดอยู่ที่ 1.1 วัตต์
AI สวัสดีชาวโลก
วิธีที่ดีที่สุดในการเริ่มต้น AI inference คือการใช้ตัวอย่าง Hello Worldซึ่งสามารถติดตั้งได้ดังนี้:
1 2 3 4 5 6 7 |
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 ../ |
คำสั่งสุดท้ายจะแสดงกล่องโต้ตอบ Hello AI World เพื่อเลือกรุ่นที่คุณต้องการใช้ ฉันเพิ่งไปกับค่าเริ่มต้น
เมื่อดาวน์โหลดรุ่นที่เลือกแล้ว ระบบจะถามว่าคุณต้องการติดตั้ง PyTorch หรือไม่:
หากคุณกำลังจะเล่นกับโมเดลที่ได้รับใช้มาก่อนหน้านี้ ไม่จำเป็นต้องติดตั้ง แต่ฉันเลือก PyTorch v1.1.10 สำหรับ Python 2.7 เผื่อว่าฉันจะมีเวลาเล่นกับการฝึกในภายหลัง
ตอนนี้เราสามารถสร้างตัวอย่างได้:
1 2 3 |
make sudo make install sudo ldconfig |
จากนั้นทดสอบ inference ภาพด้วยตัวอย่างภาพโดยใช้ ImageNet:
1 2 |
cd ~jetson-inference/build/aarch64/bin ./imagenet-console --network=googlenet images/orange_0.jpg output_0.jpg |
นี่คือผลลัพธ์ของคำสั่งสุดท้าย:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
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 สีส้ม” วางซ้อนอยู่ด้านบนของภาพ
Tiny YOLO-v3
ตัวอย่าง imageNet ใช้เวลาไม่นาน ดังนั้นฉันจึงลองใช้ตัวอย่าง Tiny-Yolo3 ซึ่งใช้ภาพ 500 ภาพตามที่อธิบายไว้ใน ฟอรัม โพสต์:
1 2 3 4 5 6 7 8 9 10 |
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 ภาพจากเน็ตพร้อมวัตถุทั่วไป:
1 2 |
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 รายการ:
1 2 3 4 5 |
/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:
1 |
--precision=kHALF |
ตอนนี้เราสามารถเรียกใช้ Tiny YOLO inferenceได้แล้ว
1 2 |
cd ~/deepstream_reference_apps/yolo sudo trt-yolo-app --flagfile=config/yolov3-tiny.txt |
นั่นคือผลลัพธ์ (ไม่ใช่ครั้งแรก):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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 ms สำหรับการ inference แต่ละครั้ง ดังนั้นเราจึงมีความเร็วใน inference ประมาณ 32 fps ตัวอย่างนั้นไม่ได้รายงานข้อมูล inference และไม่แสดงสิ่งใดบนจอแสดงผล
การตรวจจับวัตถุจากสตรีม RTSP
ในทางทฤษฎี ฉันสามารถวนลูปตัวอย่าง Tiny Yolov3 สำหรับการทดสอบความเครียดได้ แต่การเน้น GPU อย่างต่อเนื่องอย่างต่อเนื่อง วิธีที่ดีที่สุดคือ inferenceใ นสตรีมวิดีโอ ส่วนตัวอย่าง detectnet-camera ของ Jetson Inference (aka AI Hello World) สามารถทำงานได้ เมื่อคุณมีกล้อง USB ที่ใช้งานร่วมกันได้
ฉันมีเว็บแคมรุ่นเก่าสองตัวที่ฉันซื้อเมื่อ 10 ถึง 15 ปีที่แล้ว ฉันไม่เคยทำให้ Logitech Quickcam ทำงานได้ใน Linux หรือ Android แต่ก่อนหน้านี้ฉันสามารถใช้อันที่เล็กกว่าที่เรียกว่า “Venus 2.0” ในระบบปฏิบัติการทั้งสองได้ แต่คราวนี้ ฉันไม่เคยทำให้เครื่องหลังนี้ทำงานได้ทั้งใน Jetson Nano หรือแล็ปท็อป Ubuntu 18.04 ของฉัน หากคุณต้องการที่จะได้รับ MIPI หรือกล้อง USB ที่ทำงานร่วมกับคบอร์ด เพื่อตรวจสอบว่าได้ตรวจสอบรายชื่อของกล้องที่เข้ากันได้
แต่แล้วฉันก็คิดว่า…ฉันมีกล้องตัวเดียวที่ใช้งานได้! เว็บแคมบนแล็ปท็อปของฉัน แน่นอน ฉันไม่สามารถเชื่อมต่อกับบอร์ด NVIDIA ได้ แต่ฉันเริ่มสตรีม H.264 โดยใช้ VLC แทน:
1 2 |
sudo apt install vlc cvlc v4l2:///dev/video0 --sout '#transcode{vcodec=h264,vb=800,acodec=none}:rtp{sdp=rtsp://:8554/}' |
cvlc เป็นคำสั่ง line utility สำหรับ VLC ฉันสามารถเล่นสตรีมบนแล็ปท็อปของฉันเองได้ด้วย:
1 |
cvlc rtsp://192.168.1.4:8554/ |
มีความล่าช้าประมาณ 4 วินาทีและฉันคิดว่าการตั้งค่าตัวเลือกการแคชเครือข่ายเป็น 200 ms อาจช่วยได้ แต่วิดีโอด้านล่างการสับแทน ปัญหาอยู่ที่อื่น และฉันไม่มีเวลาตรวจสอบรีวิวนี้ ส่วนสำคัญคือฉันสามารถทำให้สตรีมทำงานได้:
เมื่อฉันพยายามเล่นสตรีมใน Jetson Nano ด้วย VLC มันจะเกิดข้อผิดพลาด แต่อย่าไปสนใจเรื่องนั้นเลย และลองดูว่าเราสามารถสร้างตัวอย่างกล้อง detectnet เพื่อทำงานกับสตรีม RTSP ของเราได้หรือไม่
มีคนทำอย่างนั้นเมื่อไม่กี่เดือนที่ผ่านมาจึงช่วยได้มาก เราจำเป็นต้องแก้ไขซอร์สโค้ด ~/jetson-inference/build/utils/camera/ gstCamera.cppในไฟล์สองส่วน:
-
- ปิดใช้งานการตรวจจับกล้อง CSI ในฟังก์ชัน gstCamera::ConvertRGBA:
123456789#if 0if( csiCamera() )#elseif (1)#endif{// MIPI CSI camera is NV12if( CUDA_FAILED(cudaNV12ToRGBA32((uint8_t*)input, (float4*)mRGBA[mLatestRGBA], mWidth, mHeight)) )return false; - ฮาร์ด-โค้ดสตรีม RTSP ในฟังก์ชัน gstCamera::buildLaunchStr:
1234567891011121314151617181920212223else{#if 0ss << "v4l2src device=" << mCameraStr << " ! ";ss << "video/x-raw, width=(int)" << mWidth << ", height=(int)" << mHeight << ", ";#if NV_TENSORRT_MAJOR >= 5ss << "format=YUY2 ! videoconvert ! video/x-raw, format=RGB ! videoconvert !";#elsess << "format=RGB ! videoconvert ! video/x-raw, format=RGB ! videoconvert !";#endifss << "appsink name=mysink";#endifmSource = GST_SOURCE_V4L2;}#if 1ss<<"rtspsrc location=rtsp://192.168.1.4:8554/ ! rtph264depay ! h264parse ! omxh264dec ! appsink name=mysink";#endifmLaunchStr = ss.str();
- ปิดใช้งานการตรวจจับกล้อง CSI ในฟังก์ชัน gstCamera::ConvertRGBA:
ตอนนี้ เราสามารถสร้างตัวอย่างใหม่ และรันโปรแกรมได้:
1 2 3 |
make cd aarch64/bin ./detectnet-camera -width=640 -height=480 |
และประสบความสำเร็จ! หากคุณยอมรับว่าฉันกำลังถือโดนัทชิ้นใหญ่ไว้บนหัว และซานตาคลอสก็เป็นตุ๊กตาหมี…
คอนโซลได้รับการปรับปรุงอย่างต่อเนื่องโดยมีการตรวจพบวัตถุและรายงานเวลา
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 แบบดั้งเดิมที่มักใช้ในกล้องวงจรปิด เราจะพูดถึงการใช้งาน CPU และ GPU รวมถึงการระบายความร้อนในโพสต์ถัดไป
ฉันอยากจะขอบคุณ Seeed Studio ที่ส่งชุดพัฒนา NVIDIA Jetson Nano สำหรับการประเมิน ขายในราคา $ 99.00 (~3,150฿) หรือคุณยังจะได้พบใน Amazon หรือ Lazada หรือ Shopee thailand หรือโดยตรงจาก NVIDIA
แปลจากบทความภาษาอังกฤษ : AI inference using Images, RTSP Video Stream on NVIDIA Jetson Nano Devkit
บรรณาธิการข่าวและบทความภาษาไทย CNX Software ได้มีความสนใจในด้านเทคโนโลยี โดยเฉพาะ Smart Home และ IoT