YOLOV8在清微智能芯片的部署与实现(一)

现在以YOLOV8 为例,进行演示

1. YOLOV8浮点模型训练

1.1 准备数据集

以下几种数据集获取方式,选择一个符合需求的即可。

1.1.1 下载业务数据集

1)以安全帽检测应用场景为例,下载地址
数据格式示例如下

--HelmetDetection
  --annotations
    --hard_hat_workers0.xml
    --hard_hat_workers1.xml
    --hard_hat_workers2.xml
    --... ...
  --images
    --hard_hat_workers0.png
    --hard_hat_workers1.png
    --hard_hat_workers2.png
    --... ...

每张图片对应一个标注的xml文件。
2)将数据格式转换为yolo txt训练数据格式

1.1.2 下载开源数据集

可下载imageNet数据集

1.1.3 自定义数据集

1)准备图片
建议不少于200张

2)使用LableImg标注工具
对目标进行标注

[图片]
标注结果保存为VOC格式, 同1.1.1格式相同。

1.1.4 将数据转换为yolo训练数据格式

1)将VOC 数据格式转换为yolo txt数据格式
参考链接

python step1_voc_to_yolo.py --voc-dir data/HelmetDetection/annotations --save data/HelmetDetection/yolo

2)划分数据集
参考链接
python step2_cut_data.py

3)新增yaml配置文件
最终数据格式,参考coco128, 示例如下

path: /tmp/coco128 # dataset_val10_org root dir
train: /tmp/coco128/images/train2017 # train images (relative to 'path') 128 images
val: /tmp/coco128/images/train2017 # val images (relative to 'path') 128 images
test: # test images (optional)
# Classes
names:
  0: person
  1: bicycle
  2: car
  3: motorcycle
  4: airplane
  5: bus
  6: train
  7: truck
  8: boat
  9: traffic light
  10: fire hydrant
  11: stop sign
  12: parking meter
  13: bench
  14: bird
  15: cat
  16: dog
  17: horse
  18: sheep
  19: cow
  20: elephant
  21: bear
  22: zebra
  23: giraffe
  24: backpack
  25: umbrella
  26: handbag
  27: tie
  28: suitcase
  29: frisbee
  30: skis
  31: snowboard
  32: sports ball
  33: kite
  34: baseball bat
  35: baseball glove
  36: skateboard
  37: surfboard
  38: tennis racket
  39: bottle
  40: wine glass
  41: cup
  42: fork
  43: knife
  44: spoon
  45: bowl
  46: banana
  47: apple
  48: sandwich
  49: orange
  50: broccoli
  51: carrot
  52: hot dog
  53: pizza
  54: donut
  55: cake
  56: chair
  57: couch
  58: potted plant
  59: bed
  60: dining table
  61: toilet
  62: tv
  63: laptop
  64: mouse
  65: remote
  66: keyboard
  67: cell phone
  68: microwave
  69: oven
  70: toaster
  71: sink
  72: refrigerator
  73: book
  74: clock
  75: vase
  76: scissors
  77: teddy bear
  78: hair drier
  79: toothbrush
# Download script/URL (optional)
download: https://ultralytics.com/assets/coco128.zip

1.2 yolov8项目准备

1)安装方式,或者采用方式2)

# Install the ultralytics package from PyPI
pip install ultralytics

2)下载yolov8 源码
下载地址
3)下载yolov8 模型
下载地址

1.3 训练模型

不同训练方式参考

1)准备配置文件

yolo copy-cfg

执行命令后会自动生成一个 default_copy.yaml ,修改相关的内容即可

model: yolov8s.pt # path to model file, i.e. yolov8n.pt, yolov8n.yaml
data: data/config.yaml # path to data file, i.e. coco128.yaml

2)启动模型训练

yolo cfg=default_copy.yaml

训练完成,页面会输出保存的训练模型路径。

2. YOLOV8浮点模型推理

2.1 模型推理

from ultralytics import YOLO

# ---------- 加载模型 ----------
model = YOLO('runs/detect/train19/weights/best.pt')

# ---------- 模型评估 ----------
model.predict(
    source='data/HelmetDetection/doneData/val/images/hard_hat_workers1000.png',
    save=True
)

单张模型推理,自定义代码 参考代码
默认参数值

conf_thres = 0.25
iou_thres = 0.7

2.2 模型val.py评估精度mAp

from ultralytics import YOLO

# ---------- 加载模型 ----------
model = YOLO('runs/detect/train19/weights/best.pt')

# ---------- 模型评估 ----------
model.val(data="data/HelmetDetection/config.yaml")

2.3 pt模型转换成onnx

yolo export model=runs/detect/train19/weights/best.pt format=onnx opset=14

2.4 图像前处理

# ultralytics/engine/predictor.py
def preprocess(self, im):
    """
    Prepares input image before inference.

    Args:
        im (torch.Tensor | List(np.ndarray)): BCHW for tensor, [(HWC) x B] for list.
    """
    not_tensor = not isinstance(im, torch.Tensor)
    if not_tensor:
        im = np.stack(self.pre_transform(im))
        im = im[..., ::-1].transpose((0, 3, 1, 2))  # BGR to RGB, BHWC to BCHW, (n, 3, h, w)
        im = np.ascontiguousarray(im)  # contiguous
        im = torch.from_numpy(im)

    im = im.to(self.device)
    im = im.half() if self.model.fp16 else im.float()  # uint8 to fp16/32
    if not_tensor:
        im /= 255  # 0 - 255 to 0.0 - 1.0
    return im
    
    def pre_transform(self, im):
    """
    Pre-transform input image before inference.

    Args:
        im (List(np.ndarray)): (N, 3, h, w) for tensor, [(h, w, 3) x N] for list.

    Returns:
        (list): A list of transformed images.
    """
        same_shapes = len({x.shape for x in im}) == 1
        letterbox = LetterBox(self.imgsz, auto=same_shapes and self.model.pt, stride=self.model.stride)
        return [letterbox(image=x) for x in im]

它包含以下步骤:

  • self.pre_transform:即 letterbox 添加灰条
  • im[…,::-1]:BGR → RGB
  • transpose((0, 3, 1, 2)):添加 batch 维度,HWC → CHW
  • torch.from_numpy:to Tensor
  • im /= 255:除以 255,归一化
    暂时无法在飞书文档外展示此内容

2.5 模型推理后处理

#ultralytics/models/yolo/detect/predict.py
def postprocess(self, preds, img, orig_imgs):
    """Post-processes predictions and returns a list of Results objects."""
    preds = ops.non_max_suppression(
        preds,
        self.args.conf,
        self.args.iou,
        agnostic=self.args.agnostic_nms,
        max_det=self.args.max_det,
        classes=self.args.classes,
    )

    if not isinstance(orig_imgs, list):  # input images are a torch.Tensor, not a list
        orig_imgs = ops.convert_torch2numpy_batch(orig_imgs)

    results = []
    for i, pred in enumerate(preds):
        orig_img = orig_imgs[i]
        pred[:, :4] = ops.scale_boxes(img.shape[2:], pred[:, :4], orig_img.shape)
        img_path = self.batch[0][i]
        results.append(Results(orig_img, path=img_path, names=self.model.names, boxes=pred))
    return results

后处理部分一共有两个部分,分别为 nms 处理 和 坐标绘图 处理这两步。

在这里插入图片描述

3. YOLOV8模型部署资源开发

3.1 资源准备

3.1.1 模型的裁剪

若在量化工具中进行裁剪,此步骤可跳过,参见3.4

import onnx

input_path = "yolov8.onnx"
output_path = "yolov8_sub.onnx"
input_names = ["images"]
output_names = ["/model.22/dfl/Reshape_1_output_0","/model.22/Sigmoid_output_0"]

onnx.utils.extract_model(input_path, output_path, input_names, output_names)

在这里插入图片描述

3.1.2 准备量化数据集

3.1.2.1 使用自定义数据集

使用验证数据集中选取100~200张图片,进行量化。

3.1.2.2 使用coco128开源数据集

COCO数据集是一个可用于图像检测(image detection),语义分割(semantic segmentation)和图像标题生成(image captioning)的大规模数据集。这里需要下载coco128数据集。下载请前往COCO官网。
数据集(COCO):https://cocodataset.org/

3.1.3 准备推理函数

git clone https://github.com/tsingmicro-toolchain/ts.knight-modelzoo.git

组织文件结构如下所示
[图片]

修改src/yolov8s.py代码
[图片]

3.1.4 编写config配置文件

{
  "chip": "TX5336AV200",
  "quant": {
    "model": "yolov8s.onnx",
    "framework": "onnx",
    "user-defined-script": "src/yolov8.py",
    "infer-func": "yolov8s",
    "save-dir": "/tmp/quant_output",
    "data": "coco128.yaml",
    "batch-size": "1",
    "iteration": 128,
    "output-name": "/model.22/dfl/Reshape_1_output_0 /model.22/Sigmoid_output_0"
  },
  "rne-compile": {
    "onnx": "/tmp/quant_output/yolov8s_quantize.onnx",
    "outpath": "/tmp/npu"
  },
  "rne-sim": {
    "input": "model_input.bin",
    "weight": "/tmp/npu/yolov8s_quantize_r.weight",
    "config": "/tmp/npu/yolov8s_quantize_r.cfg",
    "outpath": "/tmp/npu"
  },
  "rne-profiling": {
    "config": "/tmp/npu/yolov8s_quantize_r.cfg",
    "outpath": "/tmp/npu"
  }
}

3.2 量化编译

3.2.1 执行量化命令

准备镜像 启动容器

docker load -i ts.knight-2.2.0.8.tar.gz
docker run -v ${localhost_dir}/ts.knight-modelzoo/pytorch/builtin/cv/detection/yolov8s:/tmp -it ts.knight:2.2.0.8 /bin/bash

容器中执行量化命令

cd /tmp
Knight quant -rc yolov8s_config.json -od

3.2.2 浮点模型单张图像推理

Knight quant -rc yolov8s_config.json -m /tmp/yolov8s_output/steps/yolov8s_sub.onnx  --iteration 1 --run-mode infer

3.2.3 量化后单张图像推理

Knight quant -rc yolov8s_config.json -m /tmp/yolov8s_output_22/yolov8s_quantize.onnx  --iteration 2 --run-mode infer

3.2.4 编译得到模型部署资源

Knight rne-compile -rc yolov8s_config.json

3.3 仿真运行

3.3.1 仿真单张图片

仅对目录中的第一张图片进行 预处理转换

python3 src/make_image_input_onnx.py  --input /tmp/coco128/images/train2017 --outpath .

Knight rne-sim -rc yolov8s_config.json

3.3.2 Profiling工具评估模型性能

Knight rne-profiling -rc yolov8s_config.json

4. YOLOV8应用程序开发及部署

未完待续。。。

5. YOLOV8板端推理部署

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值