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

现在以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: person1: bicycle2: car3: motorcycle4: airplane5: bus6: train7: truck8: boat9: traffic light10: fire hydrant11: stop sign12: parking meter13: bench14: bird15: cat16: dog17: horse18: sheep19: cow20: elephant21: bear22: zebra23: giraffe24: backpack25: umbrella26: handbag27: tie28: suitcase29: frisbee30: skis31: snowboard32: sports ball33: kite34: baseball bat35: baseball glove36: skateboard37: surfboard38: tennis racket39: bottle40: wine glass41: cup42: fork43: knife44: spoon45: bowl46: banana47: apple48: sandwich49: orange50: broccoli51: carrot52: hot dog53: pizza54: donut55: cake56: chair57: couch58: potted plant59: bed60: dining table61: toilet62: tv63: laptop64: mouse65: remote66: keyboard67: cell phone68: microwave69: oven70: toaster71: sink72: refrigerator73: book74: clock75: vase76: scissors77: teddy bear78: hair drier79: 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)  # contiguousim = torch.from_numpy(im)im = im.to(self.device)im = im.half() if self.model.fp16 else im.float()  # uint8 to fp16/32if not_tensor:im /= 255  # 0 - 255 to 0.0 - 1.0return imdef 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}) == 1letterbox = 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 listorig_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 onnxinput_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.rhkb.cn/news/435243.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app进行微信小程序开发,快速上手

准备工作 IDE https://www.dcloud.io/hbuilderx.html 微信小程序开发工具 下载 / 稳定版更新日志 (qq.com) 安装流程 打开HBuilderX 点击这个logo打开终端 然后 下载一下终端插件 初始化一个demo 通过vue-cli命令行创建项目 uni-app官网 (dcloud.net.cn) (官…

【RocketMQ】SpringBoot整合RocketMQ

🎯 导读:本文档详细介绍了如何在Spring Boot应用中集成Apache RocketMQ,并实现消息生产和消费功能。首先通过创建消息生产者项目,配置POM文件引入RocketMQ依赖,实现同步消息发送,并展示了如何发送普通字符串…

02-指针代码示例

视频地址: 数组作为函数参数_哔哩哔哩_bilibili 指针是一个变量,用来存放其他变量的地址. 一、语法角度说: 需要用整形变量的指针,去存储一个整形变量的地址. 二、代码部分: (一) 1.指针赋值 int main(int argc, const char* argv[]) {int a;int* p;//这里要…

召回12 曝光过滤 Bloom Filter

在推荐系统中,如果用户看过某个物品,就不再把物品推荐给这个用户。小红书、抖音都这样做曝光过滤,原因是实验表明重复曝光同一个物品会损害用户体验。但也不是所有推荐系统都有曝光过滤,像 YouTube 这样的长视频就没有曝光过滤&am…

游戏如何对抗改包

游戏改包是指通过逆向分析手段及修改工具,来篡改游戏包内正常的设定和规则的行为,游戏包被篡改后,会被植入/剔除模块进行重打包。 本期图文我们将通过实际案例分析游戏改包的原理,并分享游戏如何应对改包问题。 安卓平台常见的改…

甄选范文“论软件的可靠性设计”,软考高级论文,系统架构设计师论文

论文真题 现代军事和商用系统中,随着系统中软件成分的不断增加,系统对软件的依赖性越来越强。软件可靠性已成为软件设计过程中不可或缺的重要组成部分。实践证明,保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制,由此提出了可靠性设计…

chsharp文件如何查找在unity中使用的 位置?

在 Unity 中,C 脚本文件(.cs 文件)被用于控制游戏对象的行为。要查找某个 C 文件在 Unity 项目中被使用的位置,你可以通过以下几种方法: 1. 查找依赖项(References) Unity 提供了一个工具&#…

Vue开发前端图片上传给java后端

前端效果图 图片上传演示 1 前端代码 <template><div><!-- 页面标题 --><h1 class"page-title">图片上传演示</h1><div class"upload-container"><!-- 使用 van-uploader 组件进行文件上传&#xff0c;v-model 绑…

高并发内存池(六):补充内容

目录 有关大于256KB内存的申请和释放处理方法 处理大于256KB的内存申请 补充内容1 补充内容2 补充内容3 处理大于256KB的内存释放 新增内容1 新增内容2 测试函数 使用定长内存池替代new 释放对象时不传对象大小 补充内容1 补充内容2 补充内容3 补充内容4 测试…

【从0开始自动驾驶】用python做一个简单的自动驾驶仿真可视化界面

【从0开始自动驾驶】用python做一个简单的自动驾驶仿真可视化界面 废话几句废话不多说&#xff0c;直接上源码目录结构init.pysimulator.pysimple_simulator_app.pyvehicle_config.json 废话几句 自动驾驶开发离不开仿真软件成品仿真软件种类多https://zhuanlan.zhihu.com/p/3…

推荐4款2024年热门的PDF转ppt工具

有时候&#xff0c;我们为了方便&#xff0c;需要将PDF里面的内容直接转换的PPT的格式&#xff0c;既方便自己演示和讲解&#xff0c;也让我们可以更加灵活的进行文件的编辑和修改。如果大家不知道要如何进行操作的话&#xff0c;我可以为大家推荐几个比窘方便实用的PDF转换工具…

UnityComputeShader Challenge1

UnityComputeShader Challenge1 using UnityEngine; using System.Collections;public class Challenge1 : MonoBehaviour {//editor拖拽对应的 compute文件public ComputeShader shader;//纹理的大小public int texResolution 1024;//着色器Renderer rend;//用于存储计算输出…

“国家高新”与“专精特新”企业的对比分析

近年来&#xff0c;企业经常听到“专精特新”和“高新技术”这两个热词。部分企业对于“专精特新”与“高新技术”之间的联系与区分却不够明确&#xff0c;其实二者之间既有重叠&#xff0c;又有模糊。“专精特新”和“高新技术”都是高技术、高核心竞争力的标志&#xff0c;都…

Excel提取数据

Excel提取数据 在使用Excel的过程中&#xff0c;我需要将带有评语的评分的文本内容提取出评分&#xff0c;如下所示 其中分数与文本之间用空格分隔&#xff0c;只有分数的评语会自动靠右对齐&#xff0c;我需要做的就是将B列的评语从中提取出分数放到C列中&#xff0c;以下为实…

【Linux第五课-进程上】PCB内部属性、标识符、进程状态、Linux下的进程状态、进程的优先级、Linux进程的调度与切换

目录 体系结构 -- 硬件上操作系统 -- 软件上进程PCB内部属性1、在linux里面看程序2、标识符获取程序的标识符父进程标识符 PPID查看进程的另一种方法通过系统调用创建进程 - fork杀掉一个进程for循环创建多个代码 3、进程状态进程排队 - 队列教程上关于进程状态表述运行阻塞&am…

【Android 14源码分析】Activity启动流程-2

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

PingCastle:一款针对活动目录AD的安全强化工具

关于PingCastle PingCastle是一款针对活动目录AD的安全强化工具&#xff0c;可以帮助广大研究人员提升活动目录的安全性&#xff0c;该工具甚至可以做到在 20% 的时间内实现 80% 的AD安全性。 Ping Castle 是一种旨在使用基于风险评估和成熟度框架的方法快速评估活动目录AD 安…

pywinauto,一款Win自动化利器!

1.安装 pywinauto是一个用于自动化Python模块&#xff0c;适合Windows系统的软件&#xff08;GUI&#xff09;&#xff0c;可以通过Pywinauto遍历窗口&#xff08;对话框&#xff09;和窗口里的控件&#xff0c;也可以控制鼠标和键盘输入&#xff0c;所以它能做的事情比之前介…

大数据实时数仓Hologres(一):Hologres 简单介绍

文章目录 Hologres 简单介绍 一、什么是实时数仓 Hologres 二、产品优势 1、专注实时场景 2、亚秒级交互式分析 3、统一数据服务出口 4、开放生态 5、MaxCompute查询加速 6、计算存储分离架构 三、应用场景 搭建实时数仓 四、产品架构 1、Shared Disk/Storage &am…

Appium独立测试自动化初始化脚本

1、查看环境初始化参数 确保appium已经开起来了&#xff0c;设置ip ,并点击启动 打开夜神模拟器&#xff0c;点击工具--设置 最下面的版本说明&#xff0c;双击进去 版本号这里再去单击。 直到进入到开发者模式。 可能我们不是开发者模式打开的状态&#xff0c;所以软件访问模…