今天,我將展示如何使用令人印象深刻的Hailo AI Hat在樹莓派5上訓(xùn)練、編譯和部署自定義模型。注意:文章內(nèi)的鏈接可能需要科學(xué)上網(wǎng)。
Hailo AI Hat
根據(jù)你的設(shè)置,在樹莓派5的CPU上運行YOLO每秒可以提供1.5到8幀(FPS)。盡管對于這樣一個小設(shè)備來說,這一性能已經(jīng)相當(dāng)出色,但對于許多實時應(yīng)用來說,這還不夠快。如果你需要更高的性能,就需要外部硬件。目前,Hailo為樹莓派5設(shè)計的AI Hat是一個極佳的選擇。
Hailo是一家專注于開發(fā)人工智能硬件的芯片制造商。在這個故事中,我感興趣的是他們專門為樹莓派5打造的AI Hat+設(shè)備:
我的樹莓派 5帶AI Hat+ Hailo8,還有Camera Noir v2
這款A(yù)I Hat有兩個版本,一個搭載Hailo-8芯片,據(jù)說可以提供26 TOPS(每秒萬億次運算),另一個搭載Hailo-8L芯片,提供13 TOPS。
在這個故事中,我將使用搭載Hailo8架構(gòu)的AI Hat版本。
為什么選擇Docker?
準(zhǔn)備好下載并安裝千兆字節(jié)的第三方庫吧。我們將使用Docker容器作為隔離環(huán)境,來配置和安裝所需的一切,而無需修改主機(jī)。
也就是說,我們需要設(shè)置兩個不同的Docker容器:
YOLOv5容器:這個容器有兩個任務(wù)。首先,我們將使用自定義數(shù)據(jù)集訓(xùn)練模型。其次,我們將模型轉(zhuǎn)換為ONNX格式。
Hailo容器:這個容器用于將ONNX文件轉(zhuǎn)換為Hailo的HEF格式。
嘗試使用同一個Docker容器來完成這兩項任務(wù),會因為庫(如numpy)的沖突而帶來不必要的麻煩。相信我,使用Docker來做它設(shè)計的事情,可以節(jié)省你的時間!
第一個Dockerfile由Hailo提供。第二個Dockerfile將在這個故事的后面部分提供。
本例中使用的數(shù)據(jù)集
我將使用Tech Zizou標(biāo)記口罩?jǐn)?shù)據(jù)集。你可以在這里找到它。
nature中發(fā)現(xiàn)的Tech Zizou標(biāo)簽口罩?jǐn)?shù)據(jù)
從Kaggle下載文件,并按照以下方式解壓:
mkdirsourceunzip -qq archive.zip -dsource/
source/obj中的文件結(jié)構(gòu)不符合YOLO的預(yù)期。希望下面的代碼能解決這個問題:
importos, shutil, random# preparing the folder structurefull_data_path ='source/obj/'extension_allowed ='.jpg'split_percentage =90images_path ='datasets/images/'ifos.path.exists(images_path): shutil.rmtree(images_path)os.mkdir(images_path)labels_path ='datasets/labels/'ifos.path.exists(labels_path): shutil.rmtree(labels_path)os.mkdir(labels_path)training_images_path = images_path +'train/'validation_images_path = images_path +'val/'training_labels_path = labels_path +'train/'validation_labels_path = labels_path +'val/'os.mkdir(training_images_path)os.mkdir(validation_images_path)os.mkdir(training_labels_path)os.mkdir(validation_labels_path)files = []ext_len =len(extension_allowed)forr, d, f in os.walk(full_data_path): forfile in f: iffile.endswith(extension_allowed): strip = file[0:len(file) - ext_len] files.append(strip)random.shuffle(files)size =len(files) split =int(split_percentage * size /100)print("copying training data")fori inrange(split): strip = files[i] image_file = strip + extension_allowed src_image = full_data_path + image_file shutil.copy(src_image, training_images_path) annotation_file = strip +'.txt' src_label = full_data_path + annotation_file shutil.copy(src_label, training_labels_path)print("copying validation data")fori inrange(split, size): strip = files[i] image_file = strip + extension_allowed src_image = full_data_path + image_file shutil.copy(src_image, validation_images_path) annotation_file = strip +'.txt' src_label = full_data_path + annotation_file shutil.copy(src_label, validation_labels_path)print("finished")
這段代碼假設(shè)數(shù)據(jù)在source/obj/文件夾中,并將輸出數(shù)據(jù)放入datasets文件夾中。將文件命名為tidy_data.py,并按照以下方式運行:
mkdirdatasetspython tidy_data.py
準(zhǔn)備數(shù)據(jù)
我們最終得到以下結(jié)構(gòu):
Yolo預(yù)期的文件夾結(jié)構(gòu)
這里有一些需要注意的事項:
這個數(shù)據(jù)集只有兩個類別:戴口罩和不戴口罩。
只有1359張訓(xùn)練圖像和151張驗證圖像。
訓(xùn)練數(shù)據(jù)量很小。僅使用這些數(shù)據(jù)從頭開始訓(xùn)練模型將產(chǎn)生非常差的模型,這種情況稱為過擬合。
我們在這里不深入探討建模細(xì)節(jié)。無論如何,為了簡化事情,我們將使用一種稱為遷移學(xué)習(xí)的技術(shù),即在訓(xùn)練開始前,將預(yù)訓(xùn)練的權(quán)重輸入到模型中。特別是,我們將使用Ultralytics提供的使用COCO數(shù)據(jù)庫訓(xùn)練的權(quán)重。
YOLOv5
Ultralytics的最新YOLO版本是11。
它比YOLOv5更快、更準(zhǔn)確。但這并不意味著YOLOv5已經(jīng)過時。實際上,Ultralytics明確表示,在某些特定場景下,YOLOv5是更優(yōu)的選擇。
在這個故事中,我有充分的理由避免使用YOLO 11:Hailo堆棧目前還不支持YOLO 11。
如果你真的不想使用YOLOv5,你可以輕松地將這個故事改編為使用YOLO 8。
Linux,朋友,Linux!
這個故事使用Linux,具體來說是Ubuntu LTS。
對于人工智能開發(fā),我推薦使用Ubuntu 20.04或22.04。LTS一路相伴!
任務(wù)簡報
整個過程由三個簡單的步驟組成:
步驟1:訓(xùn)練自定義模型:在這一步中,我們使用自定義數(shù)據(jù)加上預(yù)訓(xùn)練的YOLOv5權(quán)重來訓(xùn)練模型,以執(zhí)行我們的檢測任務(wù)(在我們的例子中,是檢測戴或不戴口罩的臉)。這一步的輸出是一個pytorchbest.pt文件。這個文件只包含我們模型的參數(shù)值。
步驟2:將best.pt轉(zhuǎn)換為ONNX格式:ONNX是一種用于機(jī)器學(xué)習(xí)模型的開放格式。這一步的輸出是一個best.onnx文件。
步驟3:將best.onnx轉(zhuǎn)換為HEF格式:Hailo可執(zhí)行格式是一種專門為在Hailo芯片上運行而高度優(yōu)化的模型。在這一步中,我們將ONNX文件轉(zhuǎn)換為HEF文件。
一旦我們有了.hef格式的模型,我們只需將其部署到樹莓派上并進(jìn)行測試。
步驟1:訓(xùn)練你的自定義數(shù)據(jù)
為Hailo架構(gòu)訓(xùn)練模型并沒有什么新奇之處。你可以像往常一樣訓(xùn)練你的模型。
如果你已經(jīng)有了模型,就跳過這一步。否則,請繼續(xù)閱讀。
首先,如果系統(tǒng)中還沒有安裝Docker,請安裝它。
同時,安裝NVIDIA Container Toolkit。
Hailo在GitHub上共享了一個包含所需資源的倉庫。克隆它:
gitclonehttps://github.com/hailo-ai/hailo_model_zoo
克隆 the hailo_model_zoo 倉庫
我們在hailo_model_zoo/training/yolov5文件夾中尋找YOLOv5訓(xùn)練的Dockerfile。移動到這個文件夾,并使用以下命令構(gòu)建鏡像:
cdhailo_model_zoo/training/yolov5docker build -t yolov5:v0 .
構(gòu)建鏡像
現(xiàn)在,運行容器:
docker run-it--name custom_training--gpus all--ipc=host-v/home/doleron/hailo/shared:/home/hailo/shared yolov5:v0
簡而言之,-it標(biāo)志要求Docker以交互模式運行容器,這對于后續(xù)執(zhí)行命令是必要的。
參數(shù)-v /home/doleron/hailo/shared:/home/hailo/shared將我機(jī)器上的/home/doleron/hailo/shared文件夾映射到容器機(jī)器上的/home/hailo/shared文件夾。
--gpus all指示Docker使用主機(jī)上可用的任何GPU。
現(xiàn)在,我們在容器內(nèi)部。我們可以檢查/home/hailo/shared的內(nèi)容,以確保我們的數(shù)據(jù)集文件在那里:
ls/home/hailo/shared/ -als
使用交互模式運行容器
這個容器沒有nano編輯器。除非你是Vim用戶,否則我建議按照以下方式安裝nano:
sudoapt updatesudo apt install nano -y
安裝完nano后,我們可以繼續(xù)并設(shè)置我們的訓(xùn)練。將datasets文件夾復(fù)制到workspace文件夾中:
cp-r /home/hailo/shared/datasets ..
現(xiàn)在,編寫data/dataset.yaml文件:
nano data/dataset.yaml
這是data/dataset.yaml的內(nèi)容:
train: ../datasets/images/trainval: ../datasets/images/valnc: 2names: 0:'using mask' 1:'without mask'
按control-x,y,然后Enter保存文件并退出nano。
創(chuàng)建data/dataset.yaml文件
是時候訓(xùn)練我們的模型了!確保你在/workspace/yolov5文件夾中,并輸入:
python train.py--img640--batch16--epochs100--datadataset.yaml--weightsyolov5s.pt
如果你遇到類似RuntimeError: CUDA out of memory的錯誤,嘗試將--batch 16減少到--batch 8或更少。
我希望你熟悉基本的機(jī)器學(xué)習(xí)術(shù)語:batches、epoch等。你可以按照這份指南調(diào)整這些超參數(shù)。
https://docs.ultralytics.com/zh/guides/hyperparameter-tuning/
如果一切順利,你的GPU將開始全力運轉(zhuǎn):
我的RTX 4070在燃燒!
保持溫度在81°C以下,你就沒事。
在我的情況下,這次訓(xùn)練大約用了40分鐘。
作為參考,使用另一臺配備GTX 1080的機(jī)器大約需要2小時。
最后,你會得到類似這樣的結(jié)果:
訓(xùn)練結(jié)束
這意味著訓(xùn)練已經(jīng)完成。我們可以在runs/exp0文件夾中檢查結(jié)果。將這個文件夾復(fù)制到共享區(qū)域:
mkdir/home/hailo/shared/runscp-r runs/exp0 /home/hailo/shared/runs/
你最終會得到一個這樣的文件夾:
訓(xùn)練結(jié)果文件夾
我們可以檢查訓(xùn)練結(jié)果:
訓(xùn)練結(jié)果
比較第一行圖表(訓(xùn)練性能)和第二行圖表(驗證性能),我們發(fā)現(xiàn)模型沒有過擬合。
值得一提的是,使用不同的驗證實例集是評估模型質(zhì)量的首要要求。
可以使用常規(guī)的機(jī)器學(xué)習(xí)工程技術(shù)來改進(jìn)模型,以達(dá)到更高的性能。然而,這并不是我們現(xiàn)在的重點。
記住:我們的重點是學(xué)習(xí)如何在樹莓派/Hailo AI Hat上使用這樣的模型。
讓我們進(jìn)入下一步!
步驟2:將best.pt文件轉(zhuǎn)換為ONNX
回到容器中,最好的權(quán)重文件是runs/exp0/weights/best.pt。我們可以使用以下命令將其轉(zhuǎn)換為ONNX:
python3 models/export.py --weights runs/exp0/weights/best.pt --img 640
注意,best.onnx已經(jīng)生成:
將best.pt轉(zhuǎn)換成best.onnx
將best.onnx復(fù)制到主機(jī)機(jī)器上:
cpruns/exp0/weights/best.onnx /home/hailo/shared/
我們已經(jīng)完成了這個容器的任務(wù)。如果你想退出,就退出吧。
步驟3:將ONNX轉(zhuǎn)換為HEF
本教程中最簡單的部分是使用YOLOv5訓(xùn)練自定義模型并將結(jié)果文件轉(zhuǎn)換為ONNX。現(xiàn)在,是時候?qū)NNX文件編譯成專有的Hailo可執(zhí)行格式(HEF)了。
在任何地方啟動一個新的終端,并編寫這個Dockerfile:
# using a CUDA supported Ubuntu 22.04 image as baseFROM nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 AS base_cudaENV DEBIAN_FRONTEND=noninteractiveENV PYTHONDONTWRITEBYTECODE=1ENV PYTHONUNBUFFERED=1RUN apt-get update && \ apt-get install -y \ # see: the Hailo DFC user guide python3.10 \ python3.10-dev \ python3.10-venv \ python3.10-distutils \ python3-pip \ python3-tk \ graphviz \ libgraphviz-dev \ libgl1-mesa-glx \ # utilities python-is-python3 \ build-essential \ sudo \ curl \ git \ nano && \ # clean up rm-rf /var/lib/apt/lists/*# update pipRUN python3 -m pip install --upgrade pip setuptools wheelWORKDIR /workspaceARG user=hailoARG group=hailoARG uid=1000ARG gid=1000RUN groupadd --gid$gid$group&& \ adduser --uid$uid--gid$gid--shell /bin/bash --disabled-password --gecos""$user&& \ chmodu+w /etc/sudoers &&echo"$userALL=(ALL) NOPASSWD: ALL">> /etc/sudoers &&chmod-w /etc/sudoers && \ chown-R$user:$group/workspace
將其保存為Dockerfile,并使用以下命令構(gòu)建鏡像:
dockerbuild -t hailo_compiler:v0 .
一旦鏡像構(gòu)建完成,按照以下方式啟動容器:
docker run-it--name compile_onnx_file--gpus all--ipc=host-v/home/doleron/hailo/shared:/home/hailo/shared hailo_compiler:v0
這個命令會給我們一個容器機(jī)器內(nèi)的命令提示符:
運行新Docker容器
這看起來像是似曾相識。我們在上一節(jié)中剛剛執(zhí)行了類似的步驟。那又怎樣?
關(guān)鍵在于:我們正在掛載第二個隔離容器來安裝Hailo的東西,而不用擔(dān)心與其他庫的沖突。特別是,我們需要安裝三個包:
Hailort:Hailo運行時平臺
Hailort Wheel:Hailort Python庫
Hailo DFC:Hailo數(shù)據(jù)流編譯器
FOSS社區(qū)習(xí)慣了開源生態(tài)系統(tǒng)。在這個上下文中,一切都可以從公開可用的倉庫中安裝。然而,Hailo在人工智能市場這個充滿挑戰(zhàn)和野性的商業(yè)世界中運作。因此,他們的軟件還不是開源的。希望Hailo的軟件至少是免費的。
要使用Hailo的東西,我們必須在Hailo Network上創(chuàng)建一個賬戶.
訪問軟件下載頁面,并下載三個包:
hailort_4.21.0_amd64.deb
hailort-4.21.0-cp310-cp310-linux_x86_64.whl
hailo_dataflow_compiler-3.31.0-py3-none-linux_x86_64.whl
Hailo 網(wǎng)絡(luò)下載頁面
將它們保存在共享文件夾的某個地方,并將它們復(fù)制到容器中:
cp/home/hailo/shared/libs/* .
在安裝軟件之前,為Python創(chuàng)建一個虛擬環(huán)境并激活它:
python -m venv .venvsource.venv/bin/activate
然后,安裝Hailo RT包:
dpkg-i ./hailort_4.21.0_amd64.deb
安裝Hailo RT
接下來,安裝Hailo RT Python API:
pipinstall ./hailort-4.21.0-cp310-cp310-linux_x86_64.whl
現(xiàn)在,安裝Hailo DFC:
pipinstall ./hailo_dataflow_compiler-3.31.0-py3-none-linux_x86_64.whl
注意,包版本表示在這個故事編寫時Hailo軟件的當(dāng)前階段。它們必須與容器Python版本(3.10)匹配。
我們還沒完成。我們必須克隆并安裝hailo_model_zoo:
gitclonehttps://github.com/hailo-ai/hailo_model_zoo.gitcdhailo_model_zoopip install -e .
檢查hailomz是否正確設(shè)置:
hailomz--version
安裝Hailo內(nèi)容
堅持住!最困難的部分現(xiàn)在來了:將best.onnx文件編譯成best.hef文件。
要使這工作,我們需要將hailo_model_zoo/cfg/postprocess_config/yolov5s_nms_config.json中的類別數(shù)更改為2:
請注意,在hailo_model_zoo倉庫中有一個hailo_model_zoo文件夾!
在開始編譯器之前,設(shè)置USER環(huán)境變量:
exportUSER=hailo
現(xiàn)在,按照以下方式調(diào)用hailomz:
hailomz compile--ckpt/home/hailo/shared/best.onnx--calib-path/home/hailo/shared/datasets/images/train/--yaml hailo_model_zoo/cfg/networks/yolov5s.yaml
慢慢來。等待10分鐘,讓hailomz優(yōu)化并編譯你的模型:
用hailomz編譯模型
如果一切順利,你會得到以下消息:
HEF 編譯
注意,將ONNX轉(zhuǎn)換為HEF包括一個新元素:校準(zhǔn)圖像。校準(zhǔn)圖像是Hailo編譯器用于優(yōu)化模型的特性空間的示例。我在這里沒有找到任何文檔,但一旦hailomz編譯器警告我使用超過1024個實例,使用相同的訓(xùn)練集似乎就能工作。
將yolov5s.hef復(fù)制到共享區(qū)域:
cpyolov5s.hef /home/hailo/shared/
最困難的部分已經(jīng)完成。我們可以退出容器實例。
在樹莓派5上部署模型
將yolov5s.hef復(fù)制到樹莓派上。
在樹莓派上運行Hailo應(yīng)用程序的細(xì)節(jié)超出了這個故事的范圍。
在樹莓派上,運行以下命令:
gitclonehttps://github.com/hailo-ai/hailo-rpi5-examples.gitcdhailo-rpi5-examplessourcesetup_env.shpython basic_pipelines/detection.py --labels-json custom.json --hef-path /home/pi/Documents/yolov5s.hef --input /home/pi/Documents/videoplayback.mp4 -f
其中custom.json是:
{ "detection_threshold":0.5, "max_boxes":200, "labels":[ "unlabeled", "with mask", "without mask" ]}
使用這個視頻的結(jié)果是:
即使在高清分辨率下,對象檢測也能達(dá)到30 fps。這是令人印象深刻的!您可以探索其他輸入類型,例如:
python basic_pipelines/detection.py --labels-json custom.json --hef-path /home/pi/Documents/yolov5s.hef --input usb -f
或者
python basic_pipelines/detection.py --labels-json custom.json --hef-path /home/pi/Documents/yolov5s.hef --input rpi -f
查看Hailo RPI示例倉庫以獲取更多參數(shù)和用法示例。
https://github.com/hailo-ai/hailo-rpi5-examples
使用其他YOLO版本
值得注意的是,在撰寫本文時,Hailo模型編譯器僅與YOLO3、YOLO4、YOLOv5、YOLOv8和YOLOX進(jìn)行了測試。
查看Hailo開發(fā)者專區(qū),了解Hailo編譯器何時將支持更早的YOLO版本。
結(jié)論
我們展示了使用Hailo AI Hat在樹莓派5上訓(xùn)練自定義數(shù)據(jù)集、編譯和部署模型的完整步驟序列。
我期待著弄清楚AI Hat能做什么。但這是另一個故事的話題了。
原文地址:
https://pub.towardsai.net/custom-dataset-with-hailo-ai-hat-yolo-raspberry-pi-5-and-docker-0d88ef5eb70f
-
AI
+關(guān)注
關(guān)注
88文章
34780瀏覽量
277111 -
樹莓派
+關(guān)注
關(guān)注
121文章
1978瀏覽量
107215 -
Docker
+關(guān)注
關(guān)注
0文章
515瀏覽量
12856
發(fā)布評論請先 登錄
基于YOLOv8實現(xiàn)自定義姿態(tài)評估模型訓(xùn)練

MCC基于樹莓派的HAT模塊
RTWconfigurationguide基于模型設(shè)計—自定義目
如何在TensorFlow2里使用Keras API創(chuàng)建一個自定義CNN網(wǎng)絡(luò)?
自定義視圖組件教程案例
自定義算子開發(fā)

NVIDIA 加快企業(yè)自定義生成式 AI 模型開發(fā)

評論