犀牛派X1 - 入门保姆级教程连载02 - 从零开始玩转边缘 AI - 中篇

上篇我因为写太多,卡住了,吓我一身冷汗,码字不容易啊。。。
上一篇讲到哪里来着?“待会儿就调用它“ 对吧?

调用前,我给大家展示一下目前物理设备接入的状态:

然后打印了3D支架:

和一个max7219的点阵屏幕,顺便也打印了支架,接入了我之前一个摄像头,请忽略它叙利亚战损的效果。

我们赶紧创建一个python代码文件 benchmark_image.py内容为:


#!/usr/bin/env python3
"""YOLO26l INT8 (QNN 2.36) 单张图片基准测试 —— 犀牛派X1 / QCS8550。

用法:
  python3 benchmark_image.py                      # 默认 bus.jpg,推理 20 次
  python3 benchmark_image.py --imgs xxx.jpg --invoke_nums 50
"""

from __future__ import annotations

import argparse
from pathlib import Path

import cv2

from utils import draw_detect_res
from yolo import YoloModel

OUTPUT_SHAPES = [[1, 4, 8400], [1, 80, 8400]]
OUTPUT_LAYOUT = "split_xyxy"
CLASS_NUM = 80
DEFAULT_MODEL = "./models/QCS8550/W8A8/cutoff_yolo26l_qcs8550_w8a8.qnn236.ctx.bin"


def parse_args():
    parser = argparse.ArgumentParser(description="Run YOLO26l QNN model with AidLite.")
    parser.add_argument("--target_model", type=str, default=DEFAULT_MODEL)
    parser.add_argument("--imgs", type=str, default="./bus.jpg")
    parser.add_argument("--height", type=int, default=640)
    parser.add_argument("--width", type=int, default=640)
    parser.add_argument("--cls_num", type=int, default=CLASS_NUM)
    parser.add_argument("--invoke_nums", type=int, default=20)
    parser.add_argument("--model_type", type=str, default="QNN")
    parser.add_argument("--conf_thres", type=float, default=0.25)
    parser.add_argument("--iou_thres", type=float, default=0.45)
    parser.add_argument("--save_path", type=str, default="./result.jpg")
    return parser.parse_args()


def main() -> int:
    args = parse_args()
    frame = cv2.imread(args.imgs)
    if frame is None:
        raise FileNotFoundError(args.imgs)
    model = YoloModel(
        args.target_model,
        OUTPUT_SHAPES,
        OUTPUT_LAYOUT,
        args.width,
        args.height,
        args.cls_num,
        args.model_type,
    )
    detections = model(frame, args.invoke_nums, args.conf_thres, args.iou_thres)
    print("===================")
    print(f"Detect {len(detections)} targets.")
    result = draw_detect_res(frame, detections)
    Path(args.save_path).parent.mkdir(parents=True, exist_ok=True)
    cv2.imwrite(args.save_path, result)
    print(f"结果图已保存: {args.save_path}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

然后在终端里面执行一下, 摄像头得对着自己。

python3 benchmark_image.py 

顺利检测完成。

检测完成我们就可以继续向前推进了,每天一个裁员小技巧哈哈!

3 个赞