位置: IT常识 - 正文

yolov8 瑞芯微RKNN和地平线Horizon芯片仿真测试部署(瑞芯微 8nm)

编辑:rootadmin
yolov8 瑞芯微RKNN和地平线Horizon芯片仿真测试部署

推荐整理分享yolov8 瑞芯微RKNN和地平线Horizon芯片仿真测试部署(瑞芯微 8nm),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:瑞芯微rk809,瑞芯微rk618,瑞芯微rk2108,瑞芯微rk2108,瑞芯微rk809,瑞芯微rk618,瑞芯微rk1808,瑞芯微rk809,内容如对您有帮助,希望把文章链接给更多的朋友!

特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。

模型和完整仿真测试代码,放在github上参考链接 模型和代码。

跟上技术的步伐,yolov8 首个板端芯片部署。

1 模型和训练

  训练代码参考官方开源的yolov8训练代码,由于SiLU在有些板端芯片上还不支持,因此将其改为ReLU。

2 导出 yolov8 onnxyolov8 瑞芯微RKNN和地平线Horizon芯片仿真测试部署(瑞芯微 8nm)

   后处理中有些算在板端芯片上效率低或者不支持,导出 onnx 需要将板端芯片不友好或不支持算子规避掉。导出onnx修改的部分。

第一步: 进行预测将pt只保存权重,增加代码如下图。

# 保存权重值 import torch self.model.fuse() self.model.eval() torch.save(self.model.state_dict(), './weights/Yolov8_dict.pt') # self.model.load_state_dict(torch.load('./weights/Yolov8_dict.pt', map_location='cpu'))

修改后运行以下代码:

from ultralytics import YOLOmodel = YOLO('./weights/yolov8n_coco128.pt')results = model(task='detect', mode='predict', source='./images/test.jpg', line_thickness=3, show=True, save=True, device='cpu')

第二步: 导出onnx,去除不需要的算子。修改代码如下。

# headsclass Detect(nn.Module): # YOLOv8 Detect head for detection models dynamic = False # force grid reconstruction export = False # export mode shape = None anchors = torch.empty(0) # init strides = torch.empty(0) # init def __init__(self, nc=80, ch=()): # detection layer super().__init__() self.nc = nc # number of classes self.nl = len(ch) # number of detection layers self.reg_max = 16 # DFL channels (ch[0] // 16 to scale 4/8/12/16/20 for n/s/m/l/x) self.no = nc + self.reg_max * 4 # number of outputs per anchor self.stride = torch.zeros(self.nl) # strides computed during build c2, c3 = max((16, ch[0] // 4, self.reg_max * 4)), max(ch[0], self.nc) # channels self.cv2 = nn.ModuleList( nn.Sequential(Conv(x, c2, 3), Conv(c2, c2, 3), nn.Conv2d(c2, 4 * self.reg_max, 1)) for x in ch) self.cv3 = nn.ModuleList(nn.Sequential(Conv(x, c3, 3), Conv(c3, c3, 3), nn.Conv2d(c3, self.nc, 1)) for x in ch) self.dfl = DFL(self.reg_max) if self.reg_max > 1 else nn.Identity() # 导出 onnx 增加 self.conv1x1 = nn.Conv2d(16, 1, 1, bias=False).requires_grad_(False) x = torch.arange(16, dtype=torch.float) self.conv1x1.weight.data[:] = nn.Parameter(x.view(1, 16, 1, 1)) def forward(self, x): shape = x[0].shape # BCHW y = [] for i in range(self.nl): t1 = self.cv2[i](x[i]) t2 = self.cv3[i](x[i]) y.append(self.conv1x1(t1.view(t1.shape[0], 4, 16, -1).transpose(2, 1).softmax(1))) # y.append(t2.sigmoid()) y.append(t2) return y for i in range(self.nl): x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1) if self.training: return x elif self.dynamic or self.shape != shape: self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5)) self.shape = shape box, cls = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).split((self.reg_max * 4, self.nc), 1) dbox = dist2bbox(self.dfl(box), self.anchors.unsqueeze(0), xywh=True, dim=1) * self.strides y = torch.cat((dbox, cls.sigmoid()), 1) return y if self.export else (y, x) def bias_init(self): # Initialize Detect() biases, WARNING: requires stride availability m = self # self.model[-1] # Detect() module # cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1 # ncf = math.log(0.6 / (m.nc - 0.999999)) if cf is None else torch.log(cf / cf.sum()) # nominal class frequency for a, b, s in zip(m.cv2, m.cv3, m.stride): # from a[-1].bias.data[:] = 1.0 # box b[-1].bias.data[:m.nc] = math.log(5 / m.nc / (640 / s) ** 2) # cls (.01 objects, 80 classes, 640 img)

增加保存onnx模型代码,如下:

# 导出 onnx 增加 import torch self.model.fuse() self.model.eval() self.model.load_state_dict(torch.load('./weights/Yolov8_dict.pt', map_location='cpu'), strict=False) print("=========== onnx =========== ") dummy_input = torch.randn(1, 3, 640, 640) input_names = ["data"] output_names = ["cls1", "reg1", "cls2", "reg2", "cls3", "reg3"] torch.onnx.export(self.model, dummy_input, "./weights/yolov8n_ZQ.onnx", verbose=False, input_names=input_names, output_names=output_names, opset_version=11) print("======================== convert onnx Finished! .... ")

以上修改后完运行以下代码:

from ultralytics import YOLOmodel = YOLO('./ultralytics/models/v8/yolov8n.yaml')results = model(task='detect', mode='predict', source='./images/test3.jpg', line_thickness=3, show=False, save=True, device='cpu')3 yolov8 onnx 测试效果

onnx模型和测试完整代码,放在github上代码。 注:图片来源coco128

4 yolov8导出瑞芯微rknn和地平线horizon仿真测试4.1 瑞芯微 rknn 仿真

  瑞芯微环境搭建和详细步骤参考上一篇 【瑞芯微RKNN模型转换和PC端仿真】。   yolov8导出rknn模型代码和后处理参考 yolov8_rknn

4.2 地平线仿真

  地平线环境搭建和详细步骤参考上一篇 【地平线Horizon模型转换和PC端仿真测试】。   yolov8导出地平线模型代码和后处理参考 yolov8_horizon

本文链接地址:https://www.jiuchutong.com/zhishi/283852.html 转载请保留说明!

上一篇:hpdrv.exe是什么进程 有什么作用 hpdrv进程查询(.hpp是什么文件)

下一篇:Win7系统Windows资源管理器老重启的解决方法(win7资源管理器叫什么)

  • 礼物包装方法最简单的教程

    礼物包装方法最简单的教程

  • 苹果13mini怎么显示电池百分比(苹果13mini怎么显示实时网速)

    苹果13mini怎么显示电池百分比(苹果13mini怎么显示实时网速)

  • 天津地铁怎么用手机支付(天津地铁怎么用nfc)

    天津地铁怎么用手机支付(天津地铁怎么用nfc)

  • 文件怎么设置密码(文件怎么设置密码和权限)

    文件怎么设置密码(文件怎么设置密码和权限)

  • 红米9a有红外遥控功能吗(红米9有没有红外线遥控功能)

    红米9a有红外遥控功能吗(红米9有没有红外线遥控功能)

  • mb2是哪个键(mb1是哪个键)

    mb2是哪个键(mb1是哪个键)

  • 空白关键帧的快捷键为(空白关键帧和关键帧有什么区别)

    空白关键帧的快捷键为(空白关键帧和关键帧有什么区别)

  • 华为手机为什么自动拨110(华为手机为什么没有5G手机了)

    华为手机为什么自动拨110(华为手机为什么没有5G手机了)

  • 华为手机在耳机模式怎么调回来(华为手机在耳机模式怎么退出)

    华为手机在耳机模式怎么调回来(华为手机在耳机模式怎么退出)

  • apple pencil 一代二代区别(applepencil一代插上没反应)

    apple pencil 一代二代区别(applepencil一代插上没反应)

  • 华为nova7se呼吸灯怎么设置(华为nova7手机呼吸灯在哪里设置)

    华为nova7se呼吸灯怎么设置(华为nova7手机呼吸灯在哪里设置)

  • 什么软件可以编辑pdf文件(什么软件可以编辑图片上的文字)

    什么软件可以编辑pdf文件(什么软件可以编辑图片上的文字)

  • qq的分享屏幕有什么用(qq的分享屏幕有什么危害)

    qq的分享屏幕有什么用(qq的分享屏幕有什么危害)

  • 手机屏幕按了没有反应应该怎么办(手机屏幕按了没有反应怎么办?)

    手机屏幕按了没有反应应该怎么办(手机屏幕按了没有反应怎么办?)

  • vsco用别人账号会看到照片吗(vsco用别人的账号)

    vsco用别人账号会看到照片吗(vsco用别人的账号)

  • 蓝牙key是什么(手机银行蓝牙key配对不上)

    蓝牙key是什么(手机银行蓝牙key配对不上)

  • 笔记本电脑可以一直充电吗(笔记本电脑可以外接键盘使用吗)

    笔记本电脑可以一直充电吗(笔记本电脑可以外接键盘使用吗)

  • 美团和大众点评的区别(美团和大众点评账号互通吗)

    美团和大众点评的区别(美团和大众点评账号互通吗)

  • 惠普m126a能无线打印吗(惠普m126a 无线)

    惠普m126a能无线打印吗(惠普m126a 无线)

  • whatsapp如何知道被拉黑(whatsapp怎么看自己的手机号)

    whatsapp如何知道被拉黑(whatsapp怎么看自己的手机号)

  • 魅族ba612是什么型号(魅族b601)

    魅族ba612是什么型号(魅族b601)

  • 花呗逾期不还会怎样(花呗逾期不还会扣名下所有银行卡的钱吗)

    花呗逾期不还会怎样(花呗逾期不还会扣名下所有银行卡的钱吗)

  • 微信怎么设置对方看不到正在输入(微信怎么设置对方发信息过来看不到)

    微信怎么设置对方看不到正在输入(微信怎么设置对方发信息过来看不到)

  • 华为p20如何分屏(华为p20如何分屏一半一半)

    华为p20如何分屏(华为p20如何分屏一半一半)

  • 最小的外置DVD刻录机(最小的外置dvd刻机多少寸)

    最小的外置DVD刻录机(最小的外置dvd刻机多少寸)

  • 毛地黄上的红天蛾 (© David Chapman/Alamy)(毛地黄长什么样)

    毛地黄上的红天蛾 (© David Chapman/Alamy)(毛地黄长什么样)

  • 报废汽车残值收入
  • 一般纳税人没有开票要交税吗
  • 税务师2022年考试成绩
  • 企业持股分红
  • 残保金为啥经过个人账户
  • 外商投资的企业是民营企业吗
  • 无发票的费用怎样补交所得税
  • 报关单汇率按出口日期还是申报日期
  • 外购货物用于什么不得抵扣进项
  • 管理费用为负数可以申报吗
  • 个人投资企业投资人签字
  • 不可修复废品损失会计分录
  • 长期挂账应收账款怎么调
  • 别人开业送的花怎么说
  • 股权投资类企业税收政策
  • 虚开增值税发票具体操作是怎样的?
  • 小规模纳税人水利建设基金计税依据是什么
  • 其他业务成本借贷方向表示
  • 个人所得税征收范围
  • 如何在excel中制作柱状图
  • 债务优化是做什么的工作
  • 回来报销差旅费的会计分录怎么写
  • 最小的手机有多大
  • 期初在产品成本是什么
  • 小企业会计准则
  • 梅尔加足球俱乐部
  • css如何实现文字环绕
  • 加计抵减现代服务税率
  • 计提的附加税
  • 你知道怎么训练
  • 路径规划是什么意思
  • ps抠图之后怎么拿出来
  • 库存商品盘点表
  • 预提费用的会计分录2018
  • 机票退票手续费新规定2023
  • 非营利组织会计就是用于确认、计量
  • Price Comparison Script
  • 将织梦dedecms转换到wordpress
  • 抵扣旅客运输服务申报时填哪行
  • 什么情况下需要做心脏造影
  • 什么叫一般
  • 所得税费用的账目处理
  • 什么情况填an
  • 过次页和承前页怎么算
  • 外购货物用于促销的账务处理
  • 关联公司代缴社保劳动者怎么处理
  • 公司主要产品
  • 递延资产放在资产负债表哪里
  • 资本公积转为实收资本会计科目
  • 会计准则允许预提吗
  • 事业单位职工福利费计提标准和使用
  • 加工废料如何处理
  • 什么是成品油发票
  • 结转生产成本是负数怎么办
  • 可转换债券转换时的会计处理
  • mysql 常用
  • mysql输入中文显示乱码
  • windows ssh-keygen
  • fedora29
  • mac怎么自定义桌面图标
  • winxp显示设置
  • 查找注册表命令
  • 笔记本拔掉硬盘开机没反应
  • 虚拟内存扩大有什么好处
  • win10怎么看下载的软件
  • win8查看系统版本
  • 局域网下访问vue点击无反应
  • 如何制作u盘启动盘
  • win10系统用正版有什么好处
  • linux安装步骤
  • 微信小程序异步回调函数
  • javascript中的继承
  • perl cgi
  • 如何使用nodejs
  • shell脚本可以使用的引号
  • linux Shell获取某目录下所有文件夹的名称
  • js修改css文件
  • jquery弹出窗口
  • 化妆品的消费税率为
  • 比亚迪车载物联网卡
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设