資料介紹
例如,未來的城市,也被稱為智慧城市,應該部署攝像頭網絡來提供監(jiān)控以防止犯罪、有效管理交通并減少能源使用。其工作原理基于多層神經網絡,使用無限數(shù)據(jù)集進行訓練。然而,訓練深度學習網絡是一項計算密集型任務,需要并行執(zhí)行許多矩陣乘法運算。因此,許多最先進的商用單板計算機不是執(zhí)行上述任務的合適硬件平臺,因為它們是單線程性能優(yōu)化架構。隨著開發(fā)人員套件的到來,例如 NVIDIA 的 Jetson Nano,專門用于運行人工智能工作負載,
?
在這個項目中,我們將注意力集中在計算機視覺中的一個突出主題:行人分析。我們根據(jù)人們行為分析可以為地方當局提供的不同用例做出這一選擇,以定制該技術可能定位的當?shù)厝丝诘男枨蟆?/font>例如,我們設想以下應用程序:
- 統(tǒng)計出入地鐵或公交車站的人數(shù),以規(guī)范行人交通。
- 統(tǒng)計在商店櫥窗里看文章的人數(shù),以建立一定數(shù)量的潛在客戶。
使用深度學習算法計算人數(shù)絕非易事,因為在訓練神經網絡時需要考慮許多參數(shù)。例如,捕獲相機所在的高度會擾亂快照的質量,從而給圖片引入噪點,從而更難跟蹤照片場景中的每個行人。因此,訓練階段可能意味著進一步的步驟來識別圖像的屬性。
解決方案
為了克服這些挑戰(zhàn),我們提出了一種基于 NVIDIA Jetson Nano 的解決方案來計算從攝像機前經過的人數(shù)。我們算法的工作原理基于以下任務:
- 以高捕捉率捕捉圖像。
- 不同幀率下的人物檢測。
- 跟蹤每個檢測到的人以在下一個數(shù)據(jù)幀中關聯(lián)。
- 通過在每個快照上區(qū)分個體來對個體進行計數(shù)。
除了人數(shù)統(tǒng)計算法外,還開發(fā)了一個基于網絡的應用程序,以使用用戶選擇的各種參數(shù)來監(jiān)控跟蹤和統(tǒng)計結果。
項目計劃
這個項目使用了一個攝像頭,可以從街道上無縫捕捉圖像,并將它們傳輸?shù)?NVIDIA 的 Jetson Nano 進行進一步處理。除了圖像處理之外,Jetson Nano 還托管一個基于 Web 的應用程序,連接到托管該應用程序的互聯(lián)網的所有設備都可以訪問該應用程序。這個項目需要一個攝像頭從街道上捕捉圖像并將它們傳輸?shù)?Jetson Nano 以處理信息。
硬件
本節(jié)列出了開發(fā)該項目所需的硬件組件:
您可以在此處找到在 Waveshare 金屬外殼中組裝 Jetson Nano 的說明。
執(zhí)行
NVIDIA 的 Jetson Nano 附帶一個軟件開發(fā)工具包,稱為 Jetpack 4.3.1,它是 GNU/Linux Ubuntu 操作系統(tǒng)的變體,用于構建人工智能應用程序。此 SDK 的安裝說明可在以下鏈接中找到。
該應用程序有 2 個主要組件:
- 一個 python 編寫的后端應用程序。
- 基于 Angular 8 框架的 typescript 編寫的前端應用程序。
后端應用程序執(zhí)行以下任務:
- 從相機源捕獲幀。
- 加載對象檢測算法。
- 在每一幀上運行推理。
- 過濾圖像圖像。
- 通過 API 公開結果。
前端應用程序改為使用后端的 API 來呈現(xiàn)結果并處理捕獲的數(shù)據(jù)。在以下部分中,將詳細介紹后端和前端應用程序,重點介紹其每個組件。讀者可以在本文末尾找到完整的源代碼。
后端 - 捕獲信息
將攝像頭捕獲的數(shù)據(jù)提取到 NVIDIA 的 Jetson Nano 中的最快方法是使用 gstream-lib 庫,該庫從插入的 CSI 攝像頭的流源中設置。OpenCV 的 VideoCapture 函數(shù)通過從設備內存中的指定緩沖區(qū)獲取圖像數(shù)據(jù)來讀取流式源。
后端 - 對象檢測
對象檢測 API 基于構建在 TensorRT 之上的檢測框架,可簡化 Mobilenet SSD 模型的加載。在初始化期間,NVIDIA 的 Jetson Nano 使用 PyCUDA python 庫來訪問 CUDA 的并行計算 API。同時,它創(chuàng)建了一個流屬性,可以在 Jetson Nano 的內存中獲取拍攝的圖像,以使用深度學習訓練的模型執(zhí)行推理操作。
class TrtSSD(object):
""" TensorRT SSD mobilenet implementation """
def _load_plugins(self):
ctypes.CDLL("models/ssd_mobilenet/libflattenconcat.so")
trt.init_libnvinfer_plugins(self.trt_logger, '')
def _load_engine(self):
TRTbin = 'models/ssd_mobilenet/TRT_%s.bin' % self.model
with open(TRTbin, 'rb') as f, trt.Runtime(self.trt_logger) as runtime:
return runtime.deserialize_cuda_engine(f.read())
def _create_context(self):
for binding in self.engine:
size = trt.volume(self.engine.get_binding_shape(binding)) * \
self.engine.max_batch_size
host_mem = cuda.pagelocked_empty(size, np.float32)
cuda_mem = cuda.mem_alloc(host_mem.nbytes)
self.bindings.append(int(cuda_mem))
if self.engine.binding_is_input(binding):
self.host_inputs.append(host_mem)
self.cuda_inputs.append(cuda_mem)
else:
self.host_outputs.append(host_mem)
self.cuda_outputs.append(cuda_mem)
return self.engine.create_execution_context()
def __init__(self, model, input_shape, output_layout=7):
"""Initialize TensorRT plugins, engine and conetxt."""
self.model = model
self.input_shape = input_shape
self.output_layout = output_layout
self.trt_logger = trt.Logger(trt.Logger.INFO)
self._load_plugins()
self.engine = self._load_engine()
self.host_inputs = []
self.cuda_inputs = []
self.host_outputs = []
self.cuda_outputs = []
self.bindings = []
self.stream = cuda.Stream()
self.context = self._create_context()
def __del__(self):
"""Free CUDA memories."""
del self.stream
del self.cuda_outputs
del self.cuda_inputs
def detect(self, img, conf_th=0.3, conf_class=[]):
"""Detect objects in the input image."""
img_resized = _preprocess_trt(img, self.input_shape)
np.copyto(self.host_inputs[0], img_resized.ravel())
cuda.memcpy_htod_async(
self.cuda_inputs[0], self.host_inputs[0], self.stream)
self.context.execute_async(
batch_size=1,
bindings=self.bindings,
stream_handle=self.stream.handle)
cuda.memcpy_dtoh_async(
self.host_outputs[1], self.cuda_outputs[1], self.stream)
cuda.memcpy_dtoh_async(
self.host_outputs[0], self.cuda_outputs[0], self.stream)
self.stream.synchronize()
output = self.host_outputs[0]
return _postprocess_trt(img, output, conf_th, self.output_layout, conf_class)
在推理結束時,根據(jù)檢測目的,基于置信概率閾值做出對象檢測決策。SSD MobileNet 模型在 Coco 數(shù)據(jù)集上獲取神經網絡的預訓練權重,產生 80 個輸出類。對于行人分析,引入了一個名為“Person”的類來收集檢測算法執(zhí)行期間使用的所有屬性。
檢測模型的驗證是通過樣本圖像在模塊中完成的,這使我們能夠毫不費力地交換被測模型。隨后,我們使用 Github 的 Actions 來評估每個模型的性能,避免在引入修改時出現(xiàn)故障。用戶可以使用 Pytest 框架訪問目錄“Test”中的模型評估。
后端 - 對象跟蹤
當人在圖像中可見時,對象定位模塊會繪制一個邊界框。對象跟蹤算法連接到對象定位模塊的輸出,以確定何時有人進入快照場景,量化在捕獲攝像機前經過的人數(shù)。兩種算法都使用稱為“t”的時間度量來存儲與邊界框質心相關的信息。在下一個時間間隔“t+1”中,它使用以下參數(shù)關聯(lián)兩個檢測到的質心:
- 最近的幀被認為是同一個對象。
- 當存儲在內存中的前一幀和當前幀不匹配時,一個離開的對象被認為是“消失的”。
- 當沒有檢測到對象的先前幀時,對象被認為是“新的”。
- 考慮到質心在先前幀中的位置,計算質心之間的距離。
該算法的魯棒性依賴于在保持與先前幀的質心位置相關的信息的基礎上跟蹤快照場景中多個對象的準確性。有關實現(xiàn)算法的更多詳細信息,請參閱 pyimagesearch 的博客。
后端 - Flask 應用程序
后端 API 構建在 Flask Web 應用程序框架之上,它將 URL 路由鏈接到 Python 函數(shù)。本項目應用的主要路線有:
- ”/” 和 “/” 渲染來自靜態(tài)前端應用程序的 html、css 和 js 文件。
- “/imgs/” 以 jpg 字節(jié)發(fā)送圖像
- “/api/delete”刪除本地圖片
- “/api/single_image” 從相機捕獲圖像,如果需要運行對象檢測算法,然后將其發(fā)送到前端。
- “/api/images”根據(jù)日期、時間和檢測到的對象類型等輸入過濾器發(fā)送圖像列表。
- “/api/list_files” 用于計算每種過濾器的圖像數(shù)量,例如日期、時間和檢測到的對象類型。
前端
開發(fā)了一個基于 Angular 8 的 Web 應用程序來執(zhí)行一些處理操作并直接從圖像中提取信息。這個基于 Web 的應用程序通過 API 與后端應用程序交互,可以在沒有主要限制的情況下加載保存的圖像。
用戶可以通過四個按鈕與 Web 應用程序交互:
- 實時捕獲模式用于動態(tài)修改每秒幀數(shù),并執(zhí)行對象檢測和跟蹤算法。
- 統(tǒng)計模式通過 ChartJS 圖表即時查看快照的統(tǒng)計數(shù)據(jù)。此外,它還提供了以馬賽克模式可視化照片的選項。
- Celery 任務模式可視化在處理階段執(zhí)行的循環(huán)異步任務。
- 按日期過濾馬賽克照片的數(shù)據(jù)選擇器。
?
結果
在許多深度學習用例中,算法的推理階段是在邊緣設備上完成的,而神經網絡的訓練階段是在云端完成的。我們在三種不同的硬件架構上測試了對象檢測應用程序的推理階段:x86、ARM 和 Maxwell GPU。廣泛使用的 Intel 和 AMD 處理器中的 x86 架構簡化了深度學習算法的開發(fā),因為許多庫可用于執(zhí)行對象檢測任務。然而,由于嚴格的功耗限制,這種架構不適合物聯(lián)網設備。另一方面,Raspberry Pi 內置的 ARM 處理器在實時檢測階段和干擾階段都沒有提供良好的性能。除了被其他架構超越之外,Raspberry Pi 的 ARM 內核需要持續(xù)冷卻,以避免在神經網絡訓練期間發(fā)生節(jié)流。最后,集成在 NVIDIA 的 Jetson Nano 上的 Maxwell GPU 在性能和功耗之間提供了良好的平衡,因為基于 Tensor RT 框架構建的對象檢測算法由于其被動冷卻可以在很長一段時間內平穩(wěn)執(zhí)行系統(tǒng)和一個附加的外部風扇。一個突出的事實是,與 x86 架構相比,我們在 SSD Mobilenet 模型的推理階段獲得了更好的性能。下表顯示了每個架構在訓練和推理階段的延遲結果:集成在 NVIDIA 的 Jetson Nano 上的 Maxwell GPU 在性能和功耗之間提供了良好的平衡,因為基于 Tensor RT 框架構建的對象檢測算法由于其被動冷卻系統(tǒng)可以在很長一段時間內平穩(wěn)執(zhí)行,并且一個附加的外部風扇。一個突出的事實是,與 x86 架構相比,我們在 SSD Mobilenet 模型的推理階段獲得了更好的性能。下表顯示了每個架構在訓練和推理階段的延遲結果:集成在 NVIDIA 的 Jetson Nano 上的 Maxwell GPU 在性能和功耗之間提供了良好的平衡,因為基于 Tensor RT 框架構建的對象檢測算法由于其被動冷卻系統(tǒng)可以在很長一段時間內平穩(wěn)執(zhí)行,并且一個附加的外部風扇。一個突出的事實是,與 x86 架構相比,我們在 SSD Mobilenet 模型的推理階段獲得了更好的性能。下表顯示了每個架構在訓練和推理階段的延遲結果:
對象跟蹤是使用 Celery 任務管理器執(zhí)行的。通過基于 Web 的應用程序內置的按鈕,可以啟動對象跟蹤任務,檢查后臺運行的其他進程。
最后但并非最不重要的一點是,用于驗證對象檢測和跟蹤的場景是辦公室內的走廊,在正常工作日期間有 130 人經過。在下面的捕獲編譯中,讀者可以觀察到我們實現(xiàn)的結果。
結論
在這個項目的制定和部署過程中,我們了解了 NVIDIA 的 Jetson Nano 提供的許多優(yōu)勢,可以執(zhí)行應用于真實場景中的對象檢測和跟蹤的深度學習任務。該設備成功地在長時間內識別和跟蹤人員,而不會達到失控的內部溫度。此外,它的小尺寸因素使其成為物聯(lián)網應用的理想選擇,因為它有助于在偏遠或危險區(qū)域進行安裝。
我們通過將神經網絡的訓練階段卸載到服務器上,在邊緣設備上維護推理階段來展示邊緣計算的概念。為了利用云上的計算,我們將數(shù)據(jù)從其來源(在本例中為 CSI 攝像機)移動到外部處理單元,克服了這種遷移的隱性挑戰(zhàn),例如延遲、可擴展性、隱私和動態(tài)網絡內部的協(xié)調條件。
總之,我們的檢測和跟蹤深度學習算法的實施有效地解決了辦公室場景的動態(tài)行為,而不會被大量的物體所淹沒,在這種情況下,人們在一個普通的工作日出現(xiàn)。基于網絡的應用程序通過引入簡單的圖像過濾器實現(xiàn)了進一步的圖像處理。
最后,我們想強調的是,這只是深度學習算法的眾多用例之一,在 NVIDIA 的 Jetson Nano 等強大平臺上實施,可以提供解決社會日常問題的方法。通過添加更好的捕獲設備、實施新的檢測解決方案,或者在將數(shù)據(jù)遷移到云中的集中位置期間簡單地建立新的漏洞條件,可以利用這項工作的許多擴展。
- 使用Azure和Nvidia Jetson的智能閉路電視
- 使用Jetson Nano構建人臉識別系統(tǒng)
- 基于Jetson NANO的助手機器人
- CUDA與Jetson Nano:并行Pollard Rho測試
- 使用Jetson Nano的CSI相機接口
- Nvidia Jetson Nano面罩Yolov4探測器
- NVIDIA Jetson開發(fā)者工具包 0次下載
- 玩轉智能硬件(一)Jetson Nano安裝篇
- 玩轉智能硬件(二)Jetson Nano配置篇
- 玩轉智能硬件(三)Jetson Nano深度學習環(huán)境搭建
- NVIDIA Jetson Nano 2GB 系列文章(1):開箱介紹
- 【從零開始學深度學習編譯器】番外二,在Jetson Nano上玩TVM
- NVIDIA Jetson Nano 電源適配器 (供電)
- YOLO v4在jetson nano的安裝及測試
- NVIDIA Jetson TX2顯存的數(shù)據(jù)手冊免費下載 22次下載
- 使用NVIDIA JetPack 6.0和YOLOv8構建智能交通應用 243次閱讀
- NVIDIA Jetson Orin Nano開發(fā)套件 961次閱讀
- 英偉達Jetson設備上的YOLOv8性能基準測試 5550次閱讀
- 簡單易學的Jetson Nano問題排除小秘訣 7867次閱讀
- 使用NVIDIA Jetson Orin Nano解決入門級邊緣人工智能挑戰(zhàn) 2175次閱讀
- 將Jetson AGX Orin開發(fā)者套件轉化為任何Jetson Orin模塊 1762次閱讀
- DeepStream Samples版的操作環(huán)境調試過程 1339次閱讀
- 采用NVIDIA Jetson助力視頻數(shù)據(jù)低時延傳輸,提高智能分析標準 3070次閱讀
- 微雪電子人工智能開發(fā)套件AI計算機介紹 903次閱讀
- 微雪電子 IMX219-77攝像頭介紹 3323次閱讀
- 微雪電子 IMX219-160攝像頭介紹 3244次閱讀
- 微雪電子攝像頭 IMX219-200介紹 5667次閱讀
- 微雪電子 人工智能開發(fā)套件 AI計算機介紹 1687次閱讀
- 微雪電子NVIDIA Jetson Nano人工智能開發(fā)套件AI板介紹 5400次閱讀
- 用Jetson Nano打造您的專屬機器人 1.1w次閱讀
下載排行
本周
- 1Keysight B1500A 半導體器件分析儀用戶手冊、說明書 (中文)
- 19.00 MB | 4次下載 | 免費
- 2使用TL431設計電源
- 0.67 MB | 2次下載 | 免費
- 3BT134雙向可控硅手冊
- 1.74 MB | 2次下載 | 1 積分
- 4一種新型高效率的服務器電源系統(tǒng)
- 0.85 MB | 1次下載 | 1 積分
- 5LabVIEW環(huán)形控件
- 0.01 MB | 1次下載 | 1 積分
- 6PR735,使用UCC28060的600W交錯式PFC轉換器
- 540.03KB | 1次下載 | 免費
- 751單片機核心板原理圖
- 0.12 MB | 1次下載 | 5 積分
- 8BP2879DB支持調光調滅的非隔離低 PF LED 驅動器
- 1.44 MB | 1次下載 | 免費
本月
- 1開關電源設計原理手冊
- 1.83 MB | 54次下載 | 免費
- 2FS5080E 5V升壓充電兩串鋰電池充電管理IC中文手冊
- 8.45 MB | 23次下載 | 免費
- 3DMT0660數(shù)字萬用表產品說明書
- 0.70 MB | 13次下載 | 免費
- 4UC3842/3/4/5電源管理芯片中文手冊
- 1.75 MB | 12次下載 | 免費
- 5ST7789V2單芯片控制器/驅動器英文手冊
- 3.07 MB | 11次下載 | 1 積分
- 6TPS54202H降壓轉換器評估模塊用戶指南
- 1.02MB | 8次下載 | 免費
- 7STM32F101x8/STM32F101xB手冊
- 1.69 MB | 8次下載 | 1 積分
- 8基于MSP430FR6043的超聲波氣體流量計快速入門指南
- 2.26MB | 7次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935119次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73807次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65987次下載 | 10 積分
評論
查看更多