1.?YOLOv8姿態估計與部署
姿態估計(Pose estimation)是一項涉及識別圖像中關鍵點位置的任務。 關鍵點可以表示對象的各個部分,如關節、地標或其他獨特特征,關鍵點的位置通常表示為一組2D[x, y]或3D[x, y, visible]坐標。
YOLOv8-Pose人體姿態估計,會先檢測出圖像中所有的人體檢測框,然后每個檢測框進行人體姿態估計。 YOLOv8-Pose使用的數據集是?COCO Keypoints 2017?,總共包含20萬張圖像,支持人體17個關鍵點。
YOLOv8-Pose提供了不同版本模型,適用于不同的環境:
-
YOLOv8n-pose: 輕量級的模型,適用于計算資源受限的環境。
-
YOLOv8s-pose: 相對輕量級但性能更好的模型,平衡了速度和準確度。
-
YOLOv8m-pose: 中等大小的模型,提供較高的準確度,適用于需要更準確結果的場景。
-
YOLOv8l-pose: 較大的模型,具有更高的準確度,但速度較慢,適用于高精度要求的應用。
-
YOLOv8x-pose: 精確最大的的模型,但速度最慢,適用于對準確度有極高要求的場景。
-
YOLOv8x-pose-p6: 支持高分辨率圖像輸入,更高的準確度和更強的檢測能力,但需要更多的計算資源。
詳細請查看:GitHub - ultralytics/ultralytics: Ultralytics YOLO 🚀?。
1.1.?YOLOv8-pose簡單測試
YOLOv8n-pose模型推理測試(使用python):
123456789 10 11 12 13 | from ultralytics import YOLO# Load a model model = YOLO("./yolov8n-pose.pt")# Predict with the model results = model("https://ultralytics.com/images/bus.jpg", save=True)# 打印輸出結果 for result in results:boxes = result.boxes #Boxes對象keypoints = result.keypoints # Keypoints對象print(boxes, keypoints) |
# 獲取yolov8n-pose.pt (yolov8) llh@anhao: wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n-pose.pt # 推理測試 (yolov8) llh@anhao: python yolov8n_pose.py Downloading https://ultralytics.com/images/bus.jpg to 'bus.jpg'... 100%|███████████████████████████████████████████████████████████████| 134k/134k [00:00<00:00, 1.03MB/s] image 1/1 /mnt/e/work/yolov8/bus.jpg: 640x480 4 persons, 53.6ms Speed: 4.5ms preprocess, 53.6ms inference, 120.5ms postprocess per image at shape (1, 3, 640, 480) Results saved to runs/pose/Predictultralytics.engine.results.Boxes object with attributes:cls: tensor([0., 0., 0., 0.], device='cuda:0') conf: tensor([0.8908, 0.8800, 0.8732, 0.4125], device='cuda:0') data: tensor([[4.5000e+01, 3.9700e+02, 2.4200e+02, 9.0600e+02, 8.9082e-01, 0.0000e+00],[6.7000e+02, 3.9000e+02, 8.1000e+02, 8.7800e+02, 8.8004e-01, 0.0000e+00],[2.2400e+02, 4.0400e+02, 3.4400e+02, 8.5600e+02, 8.7320e-01, 0.0000e+00],[0.0000e+00, 4.8500e+02, 7.2000e+01, 8.9300e+02, 4.1249e-01, 0.0000e+00]], device='cuda:0') id: None is_track: False orig_shape: (1080, 810) shape: torch.Size([4, 6]) xywh: tensor([[143.5000, 651.5000, 197.0000, 509.0000],[740.0000, 634.0000, 140.0000, 488.0000],[284.0000, 630.0000, 120.0000, 452.0000],[ 36.0000, 689.0000, 72.0000, 408.0000]], device='cuda:0') #省略.................
上面YOLOv8n-pose模型預測,最后還打印輸出了boxes和keypoints。boxes顯示有檢測出的四個框的類別(cls)、四個框的置信度(conf)、 框坐標和置信度(data)、原始圖像尺寸(orig_shape)、邊界框的中心坐標和尺寸(xywh)等等。
結果圖片保存在當前目錄的runs/pose/Predict中,查看如下:
?
1.2.?YOLOv8-pose模型導出
使用?airockchip/ultralytics_yolov8?導出適合部署到rknpu上的模型,模型的改動:
-
修改輸出結構, 移除后處理結構(后處理結果對于量化不友好);
-
dfl結構在NPU處理上性能不佳,移至模型外部的后處理階段,此操作大部分情況下可提升推理性能;
獲取自行訓練或者官方的yolov8-pose模型,根據模型路徑調整./ultralytics/cfg/default.yaml中model路徑,然后導出模型:
(yolov8) llh@anhao: cd ultralytics_yolov8 (yolov8) llh@anhao: export PYTHONPATH=./ (yolov8) llh@anhao: python ./ultralytics/engine/exporter.py Ultralytics YOLOv8.2.82 🚀 Python-3.9.19 torch-2.4.1+cu121 CPU (Intel Core(TM) i7-14700F) YOLOv8n-pose summary (fused): 187 layers, 3,289,964 parameters, 0 gradients, 9.2 GFLOPsPyTorch: starting from '../yolov8n-pose.pt' with input shape (16, 3, 640, 640) BCHW and output shape(s) ((), (16, 17, 3, 8400)) (6.5 MB)RKNN: starting export with torch 2.4.1+cu121...RKNN: feed ../yolov8n-pose.onnx to RKNN-Toolkit or RKNN-Toolkit2 to generate RKNN model. Refer https://github.com/airockchip/rknn_model_zoo/tree/main/models/CV/object_detection/yolo RKNN: export success ? 0.4s, saved as '../yolov8n-pose.onnx' (12.6 MB)Export complete (3.3s) Results saved to /xxx/yolov8 Predict: yolo predict task=pose model=../yolov8n-pose.onnx imgsz=640 Validate: yolo val task=pose model=../yolov8n-pose.onnx imgsz=640 data=/usr/src/app/ultralytics/datasets/coco-pose.yaml Visualize: https://netron.app# 測試使用模型為yolov8n-pose.pt,在對應目錄下生成yolov8n-pose.onnx模型。
可以使用?netron?查看導出的onnx模型的網絡結構:
?
1.3.?導出rknn模型
導出的yolov8-pose模型,使用toolkit2將器轉換成rknn模型。
# 獲取配套例程的轉換程序onnx2rknn.py# python onnx2rknn.py <onnx_model> <TARGET_PLATFORM> <dtype(optional)> <output_rknn_path(optional)> (toolkit2.2) llh@anhao:/xxx/yolov8$ python onnx2rknn.py ./yolov8n-pose.onnx rk3588 fp I rknn-toolkit2 version: 2.2.0 --> Config model done --> Loading model I Loading : 100%|██████████████████████████████████████████████| 144/144 [00:00<00:00, 67581.94it/s] done --> Building model W build: The dataset='../datasets/COCO/coco_subset_20.txt' is ignored because do_quantization = False! I OpFusing 0: 100%|██████████████████████████████████████████████| 100/100 [00:00<00:00, 717.31it/s] I OpFusing 1 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 438.48it/s] I OpFusing 0 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 373.56it/s] I OpFusing 1 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 331.13it/s] I OpFusing 2 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 177.53it/s] I rknn building ... I rknn buiding done. done --> Export rknn model output_path: ./yolov8_pose.rknn done
模型轉換測試設置了目標是rk3588,如果是lbcat-0/1/2,需要設置目標為rk3566/rk3568,并且沒有量化模型。
1.4.?部署測試
YOLOv8-pose模型板卡上部署,其推理和后處理大致步驟:
-
預處理,對輸入圖像進行letterbox,具體通過rga或者cpu實現,圖像歸一化等操作在rknn模型中;
-
模型推理;
-
后處理,根據設置的置信度閾值BOX_THRESH,對檢測框進行篩選,然后對符合要求的檢測框進行解碼,并進行nms,解碼關鍵點,還原到原圖尺度等。
板卡上編譯測試例程,編譯前系統要安裝opencv:
# 魯班貓板卡系統默認是debian或者ubuntu發行版,直接使用apt安裝opencv,或者自行編譯安裝opencv sudo apt update sudo apt install libopencv-dev# 獲取教程配套例程,,或者從https://github.com/airockchip/rknn_model_zoo獲取測試例程# 其中-t指定目標設備,這里測試使用lubancat-4,設置rk3588,如果是lubancat-0/1/2就設置rk356x # 如果系統內存大于4G的,設置參數-d cat@lubancat:~/xxx$ cd example/yolov8/yolov8_pose cat@lubancat:~/xxx/example/yolov8/yolov8_pose$ ./build-linux.sh -t rk3588 -d
重要
部署使用的librknnrt庫的版本需要與模型轉換的Toolkit2的版本一致。
編譯輸出程序在當前目錄的install/rk3588_linux中,測試yolov8_pose_image例程:
cat@lubancat:~/xxx/install/$ ./yolov8_pose_image_demo ./model/yolov8_pose.rknn ./model/bus.jpg load lable ./model/yolov8_pose_labels_list.txt model input num: 1, output num: 4 input tensors: index=0, name=images, n_dims=4, dims=[1, 640, 640, 3], n_elems=1228800, size=2457600, fmt=NHWC, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 output tensors: index=0, name=385, n_dims=4, dims=[1, 65, 80, 80], n_elems=416000, size=832000, fmt=NCHW, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 index=1, name=400, n_dims=4, dims=[1, 65, 40, 40], n_elems=104000, size=208000, fmt=NCHW, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 index=2, name=415, n_dims=4, dims=[1, 65, 20, 20], n_elems=26000, size=52000, fmt=NCHW, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 index=3, name=537, n_dims=4, dims=[1, 17, 3, 8400], n_elems=428400, size=856800, fmt=NCHW, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 model is NHWC input fmt model input height=640, width=640, channel=3 origin size=640x640 crop size=640x640 input image: 640 x 640, subsampling: 4:2:0, colorspace: YCbCr, orientation: 1 scale=1.000000 dst_box=(0 0 639 639) allow_slight_change=1 _left_offset=0 _top_offset=0 padding_w=0 padding_h=0 src width=640 height=640 fmt=0x1 virAddr=0x0x7fa71f2010 fd=0 dst width=640 height=640 fmt=0x1 virAddr=0x0x7fa70c6000 fd=8 src_box=(0 0 639 639) dst_box=(0 0 639 639) color=0x72 rga_api version 1.10.0_[2] person @ (108 235 224 536) 0.888 person @ (211 241 284 507) 0.872 person @ (476 234 560 518) 0.861 write_image path: out.png width=640 height=640 channel=3 data=0x7fa71f2010
在當前目錄的install/rk3588_linux中,還有一個yolov8_pose_videocapture_demo,可以打開攝像頭或者視頻文件,下面測試打開攝像頭,并拍攝其他屏幕顯示的畫面。
# 執行例程請注意攝像頭的設備號,支持的分辨率,編解碼格式等等,具體請查看yolov8_pose_videocapture_demo.cc源文件 cat@lubancat:~/xxx/install/$ ./yolov8_pose_videocapture_demo ./model/yolov8_pose.rknn 0 load lable ./model/yolov8_pose_labels_list.txt model input num: 1, output num: 4 input tensors: index=0, name=images, n_dims=4, dims=[1, 640, 640, 3], n_elems=1228800, size=2457600, fmt=NHWC, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 output tensors: index=0, name=385, n_dims=4, dims=[1, 65, 80, 80], n_elems=416000, size=832000, fmt=NCHW, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 index=1, name=400, n_dims=4, dims=[1, 65, 40, 40], n_elems=104000, size=208000, fmt=NCHW, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 index=2, name=415, n_dims=4, dims=[1, 65, 20, 20], n_elems=26000, size=52000, fmt=NCHW, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 index=3, name=537, n_dims=4, dims=[1, 17, 3, 8400], n_elems=428400, size=856800, fmt=NCHW, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 model is NHWC input fmt model input height=640, width=640, channel=3 scale=1.000000 dst_box=(0 80 639 559) allow_slight_change=1 _left_offset=0 _top_offset=80 padding_w=0 padding_h=160 src width=640 height=480 fmt=0x1 virAddr=0x0x55923ea480 fd=0 dst width=640 height=640 fmt=0x1 virAddr=0x0x7f79666000 fd=26 src_box=(0 0 639 479) dst_box=(0 80 639 559) color=0x72 rga_api version 1.10.0_[2] fill dst image (x y w h)=(0 0 640 640) with color=0x72727272 rknn_run # 省略...................
?
更多rknn模型例程請參考?rknn_model_zoo倉庫?。
需要注意:測試usb攝像頭,請確認攝像頭的設備號,修改例程中攝像頭支持的分辨率和MJPG格式等, 如果是mipi攝像頭,需要opencv設置轉換成rgb格式以及設置分辨率大小等等。
12.5.?參考鏈接
Install Ultralytics - Ultralytics YOLO Docs
GitHub - ultralytics/ultralytics: Ultralytics YOLO 🚀
GitHub - airockchip/ultralytics_yolov8: NEW - YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite
GitHub - airockchip/rknn_model_zoo