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

news2024/12/23 23:11:29

现在以YOLOV8 为例,进行演示

文章目录

  • 1. YOLOV8浮点模型训练
    • 1.1 准备数据集
      • 1.1.1 下载业务数据集
      • 1.1.2 下载开源数据集
      • 1.1.3 自定义数据集
      • 1.1.4 将数据转换为yolo训练数据格式
    • 1.2 yolov8项目准备
    • 1.3 训练模型
  • 2. YOLOV8浮点模型推理
    • 2.1 模型推理
    • 2.2 模型val.py评估精度mAp
    • 2.3 pt模型转换成onnx
    • 2.4 图像前处理
    • 2.5 模型推理后处理
  • 3. YOLOV8模型部署资源开发
    • 3.1 资源准备
      • 3.1.1 模型的裁剪
      • 3.1.2 准备量化数据集
        • 3.1.2.1 使用自定义数据集
        • 3.1.2.2 使用coco128开源数据集
      • 3.1.3 准备推理函数
      • 3.1.4 编写config配置文件
    • 3.2 量化编译
      • 3.2.1 执行量化命令
      • 3.2.2 浮点模型单张图像推理
      • 3.2.3 量化后单张图像推理
      • 3.2.4 编译得到模型部署资源
    • 3.3 仿真运行
      • 3.3.1 仿真单张图片
      • 3.3.2 Profiling工具评估模型性能
  • 4. YOLOV8应用程序开发及部署
  • 5. 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板端推理部署

未完待续。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

纯CSS实现有趣emoji切换开关

这是一个纯CSS创建的动画切换开关,它不仅能够在视觉上吸引用户,还能通过交互提供即时反馈。本文将解析源码的核心实现逻辑,这个项目的核心是使用CSS变量、3D变换和过渡效果来实现一个动态的、响应式的用户界面元素。 关键技术点 CSS变量&am…

[Python学习日记-31] Python 中的函数

[Python学习日记-31] Python 中的函数 简介 语法定义 函数的参数 简介 引子: 你是某公司的一个高级程序员,现在老板让你写一个监控程序,需要24小时全年无休的监控公司网站服务器的系统状况,当 CPU、Memory、Disk 等指标的使用…

基于SpringBoot+Vue+MySQL的体育商城系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网的飞速发展,电子商务已成为人们日常生活中不可或缺的一部分。体育用品市场作为其中的一个重要分支,也逐渐向线上转移。基于SpringBootVueMySQL的体育商城系统应运而生,旨在通过构建…

如何使用ssm实现基于Java的高校物业工程报修系统

TOC ssm736基于Java的高校物业工程报修系统jsp 绪论 1.1研究背景与意义 信息化管理模式是将行业中的工作流程由人工服务,逐渐转换为使用计算机技术的信息化管理服务。这种管理模式发展迅速,使用起来非常简单容易,用户甚至不用掌握相关的专…

一行命令将Cmder添加到系统右键菜单中----配置环境

第一步,去官网下载一个简版的文件 ** 第二步,将下载的文件解压后如图,找到Cmder.exe右键以管理员身份运行 第三步,在窗口输入cmder /register all然后回车 第四步,OK!不管在哪里都可以使用了,直接右键即可

vscode环境迁移

关注B站可以观看更多实战教学视频:hallo128的个人空间 vscode环境迁移 Setting 即可打开settings.json {"python.pythonPath": "/Users/apple/opt/anaconda3/bin/python","cmake.cmakePath": "/usr/local/bin/cmake",&qu…

[c++高阶]模版进阶

1.前言 在我们学习c的时候,常常会遇见要使用函数重载的情况。而当使用函数重载时,通常会使得我们编写很多重复的代码,这样就显得非常臃肿,并且效率非常的低下。 重载的函数仅仅只是类型不同,代码的复用率比较低&#x…

浮点数的这些特性你了解吗

问题1:下面的代码,输出结果是什么: public class CaclTest{public void test1(){float f 1.0F / 0.0F;System.out.println("f:" f)}public static void main(String[] args){CaclTest ct new CaclTest();ct.test1();}} A. 运行抛出异常:j…

7.数据结构与算法-循环链表

如果经常对首位元素进行操作,用尾元素更方便更快捷 两个循环链表合并

信息安全工程师(21)安全协议

前言 安全协议是建立在密码体制基础上的一种交互通信协议,它运用密码算法和协议逻辑来实现认证、密钥分配、数据机密性、完整性和抗否认性等安全目标。 一、定义与目的 安全协议旨在确保网络环境中信息交换的安全性,通过密码技术和协议逻辑来保护数据的机…

第八届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)

一.题目分析 (1).题目 (2).题目分析 1.按键功能分析----过程控制 a. 选择按键按下的个数和目标层数(每个按键都要在一秒之内按下,否则就结束) b. 当升降机到达目标平台,LED灯熄灭 c.…

负载均衡(Load Balancing)是一种计算机技术,用于在网络应用中分配工作负载,以优化资源使用、最大化吞吐量、减少响应时间以及避免过载。

负载均衡(Load Balancing)是一种计算机技术,用于在网络应用中分配工作负载,以优化资源使用、最大化吞吐量、减少响应时间以及避免过载。通过将任务均匀地分布在多个组件上,如服务器、网络链接、CPU、硬盘等&#xff0c…

【AG 创新工坊】探索存内计算的未来,共话 AGI 时代

目录 ⚛️1. 会议详情 ☪️2. 会议回顾 ♋2.1 多模态时代,存内计算架构的应用与发展 ♏2.2 分布式环境下深度学习任务的高效可靠执行研究 ♐2.3 IGZO在后道单片三维集成中的机遇与挑战 ♑2.4 witin-nn:神经网络算法模型在存内开发板上的应用开发 ♉2.5 茶歇交…

讯飞星火编排创建智能体学习(一)最简单的智能体构建

目录 开篇 智能体的概念 编排创建智能体 创建第一个智能体 ​编辑 大模型节点 测试与调试 开篇 前段时间在华为全联接大会上看到讯飞星火企业级智能体平台的演示,对于拖放的可视化设计非常喜欢,刚开始以为是企业用户才有的,回来之后查…

X86架构(九)——保护模式的进入

全局描述符表 全局描述符表(Global Descriptor Table,GDT)是保护模式下非常重要的一个数据结构。 在保护模式下,对内存的访问仍然使用段地址和偏移地址,在每个段能够访问之前,必须先行设置好 GDT 的地址,并加载全局描述符表寄存…

推荐4款2024年大家都在用的高质量翻译器。

翻译器在我们的生活中有着很重要的作用,不管是我们在学习还是工作,生活娱乐,出国旅游等场合都会派上用场,它是我们解决沟通的障碍,提高阅读效率的好帮手。我自己使用的翻译器有很多,可以给大家列举几款特别…

依赖倒置原则(学习笔记)

抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。 以…

了解输出电源优先级

主要又SUB,SBU以及USB三种模式。 调试10kW逆变器存在的输出电源优先级的问题,当优先级为SUB时,利用电压源模拟电池,当电池电压超过58.4V,即过压,在接入市电,市电继电器仍然闭合,仍然…

pyboard405意外故障,micropython OLED例程无法运行,折腾了大半天。

thonny报告&#xff1a; Traceback (most recent call last): File "<stdin>", line 3, in <module> RuntimeError: name too mode # main.py -- put your code here! from machine import I2C,Pin #从machine模块导入I2C、Pin子模块 from ss…

javascript:监听浏览器页签切换

监听页面的可见性变化&#xff0c;在很多场景下非常实用&#xff0c;比如跟踪用户行为、节省资源、优化性能等。 1 代码示例 document.addEventListener("visibilitychange", () > {if (document.visibilityState "visible") {alert("当前页面已…