เมื่อเดือนที่แล้วฉันได้รับชุดนักพัฒนา 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
โมดูลที่โหลด:
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 ช่วยให้เราสามารถตรวจสอบโหมดพลังงาน:
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
NVIDIA ยังจัดเตรียม tegrastats utility เพื่อรายงานการใช้งานแบบเรียลไทม์ อุณหภูมิ และการใช้พลังงานของส่วนต่างๆ ของโปรเซสเซอร์:
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 ซึ่งสามารถติดตั้งได้ดังนี้:
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 เผื่อว่าฉันจะมีเวลาเล่นกับการฝึกในภายหลัง
ตอนนี้เราสามารถสร้างตัวอย่างได้:
make
sudo make install
sudo ldconfig
จากนั้นทดสอบ inference ภาพด้วยตัวอย่างภาพโดยใช้ ImageNet:
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 ภาพตามที่อธิบายไว้ใน ฟอรัม โพสต์ :
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:
ตอนนี้เราสามารถเรียกใช้ Tiny YOLO inferenceได้แล้ว
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 แทน:
sudo apt install vlc
cvlc v4l2 : ///dev/video0 --sout '#transcode{vcodec=h264,vb=800,acodec=none}:rtp{sdp=rtsp://:8554/}'
cvlc เป็นคำสั่ง line utility สำหรับ VLC ฉันสามารถเล่นสตรีมบนแล็ปท็อปของฉันเองได้ด้วย:
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:
#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 ;
ฮาร์ด-โค้ดสตรีม RTSP ในฟังก์ชัน gstCamera::buildLaunchStr:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 แบบดั้งเดิมที่มักใช้ในกล้องวงจรปิด เราจะพูดถึงการใช้งาน 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