位置: 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资源管理器叫什么)

  • 小米手机怎么查看激活日期(小米手机怎么查出厂日期 激活日期)

    小米手机怎么查看激活日期(小米手机怎么查出厂日期 激活日期)

  • blued拉黑对方还能看到我吗(blued拉黑对方还显示距离吗)

    blued拉黑对方还能看到我吗(blued拉黑对方还显示距离吗)

  • soul隐身有什么用(soul的隐身功能会被对方看到吗)

    soul隐身有什么用(soul的隐身功能会被对方看到吗)

  • 苹果xs双扬声器设置(iphonexs双扬声器音量 一样大吗)

    苹果xs双扬声器设置(iphonexs双扬声器音量 一样大吗)

  • 苹果就寝为什么删不掉(iphone就寝之后会怎么样)

    苹果就寝为什么删不掉(iphone就寝之后会怎么样)

  • qq群消息部分收不到(qq群消息部分收不到消息)

    qq群消息部分收不到(qq群消息部分收不到消息)

  • 淘宝多少天自动确认收货(淘宝多少天自动默认好评)

    淘宝多少天自动确认收货(淘宝多少天自动默认好评)

  • 使用域名访问网站是啥意思(使用域名访问网站怎么打开手机)

    使用域名访问网站是啥意思(使用域名访问网站怎么打开手机)

  • iphone11几个卡槽(苹果11几个卡槽)

    iphone11几个卡槽(苹果11几个卡槽)

  • airpods怎么鉴别真假(airpods怎么鉴别是别人的还是自己的)

    airpods怎么鉴别真假(airpods怎么鉴别是别人的还是自己的)

  • 标压和低压的区别(标压和低压的区别 h t)

    标压和低压的区别(标压和低压的区别 h t)

  • i7 8750h属于什么级别(i7 8750h属于什么级别的cpu)

    i7 8750h属于什么级别(i7 8750h属于什么级别的cpu)

  • 腾讯大王卡腾讯课堂免流吗(腾讯大王卡腾讯会员怎么领取)

    腾讯大王卡腾讯课堂免流吗(腾讯大王卡腾讯会员怎么领取)

  • oppo reno z屏幕分辨率(oppo reno z怎么分屏)

    oppo reno z屏幕分辨率(oppo reno z怎么分屏)

  • 已购买成功的淘宝订单怎么删除(淘宝已购买宝贝)

    已购买成功的淘宝订单怎么删除(淘宝已购买宝贝)

  • 华为lldal20什么型号(华为lndal20是啥型号)

    华为lldal20什么型号(华为lndal20是啥型号)

  • 蓝牙耳机不煲机会怎样(蓝牙耳机不煲机后果)

    蓝牙耳机不煲机会怎样(蓝牙耳机不煲机后果)

  • 手机屏幕漏液敢充电不(手机屏幕漏液了会扩散吗)

    手机屏幕漏液敢充电不(手机屏幕漏液了会扩散吗)

  • ipone11单卡还是双卡(苹果11单卡好还是双卡)

    ipone11单卡还是双卡(苹果11单卡好还是双卡)

  • 微信升级了 怎么变回原来的版本(微信升级了怎么切换语音通话)

    微信升级了 怎么变回原来的版本(微信升级了怎么切换语音通话)

  • 手机怎样退出炫彩桌面(手机上怎么退出)

    手机怎样退出炫彩桌面(手机上怎么退出)

  • network boot是什么意思(network boot选项)

    network boot是什么意思(network boot选项)

  • 华为p30悬浮窗设置(华为p30悬浮窗设置在哪里)

    华为p30悬浮窗设置(华为p30悬浮窗设置在哪里)

  • wps表格中如何创建组(wps表格如何创建组)

    wps表格中如何创建组(wps表格如何创建组)

  • mediapassk.exe是什么进程 有什么用 mediapassk进程查询(mediabrowser.exe是什么)

    mediapassk.exe是什么进程 有什么用 mediapassk进程查询(mediabrowser.exe是什么)

  • sdiff命令  以并排方式合并文件之间的差异

    sdiff命令 以并排方式合并文件之间的差异

  • 上年度已交房产税减免如何做账务处理
  • 企业所得税核定征收的条件
  • 法定免税项目包括
  • 成本结算怎么处理?
  • 收到的加盟费要交税吗
  • 工程物资什么时候结转到开发成本里面
  • 餐饮发票数量单价必须填吗
  • 法律规定公司账本保存年限
  • 总资产报酬率的公式
  • 管理会计期末存货计算公式
  • 企业存货占用资金的比例
  • 注册地址与实际办公地址不一致怎么办
  • 挂失的存单还有记录吗
  • 预付款如何扣除
  • 服务业的地税是什么税
  • 个体工商户怎么交社保
  • 开增值税专用发票需要合同吗
  • 税款滞纳金怎么入账
  • 未分配利润转增股本 个人所得税
  • 哪些进项税额不允许从销售额中抵扣?
  • 开票金额与实际金额差5元
  • 跨月可以开票吗
  • 小型微利企业普惠性税收减免政策执行期限
  • 软件著作权认证查询
  • 技术转让时增值税怎么算
  • 企业控股情况是指
  • gif图片查看软件
  • 净资产收益率公式推导
  • php 用户和密码
  • linux中添加用户和组的操作
  • shnlog.exe - shnlog是什么进程 有什么用
  • linux怎么更改账户名
  • 主板BIOS无法更改显存
  • php-mbstring
  • 付款凭证怎么填写电脑
  • 不能运行windows10的设备有哪些
  • list.php
  • 资产评估增值是什么意思
  • 银行承兑汇票收费标准
  • 收取房屋租赁费的会计分录
  • 个体户需要交什么保险
  • python清除变量的命令
  • centos离线安装mondo
  • 审计外聘人员支付标准
  • 建筑企业工程结算账务处理
  • sql编程软件哪个好用
  • 新公司第一年年度总结
  • 机械租赁收入算成本吗
  • 个税手续费返还增值税申报表怎么填
  • 银行承兑汇票包括支票吗
  • 税控盘忘记抄报税怎么办
  • 有进项税额转出,怎么计提附加税
  • 坏账收不回来如何做分录
  • 资产评估增值的税务处理
  • 住房贷款利息专项附加扣除怎么用
  • 园林绿化公司的税率是多少
  • 办理分公司的流程样本
  • 如何查看连接网络的密码
  • 清空数据库中所有表的数据
  • windows2003r2安装教程
  • ubuntu15.10中文版
  • centos权限不够怎么办
  • windows找不到cmd怎么办
  • windows7回收站图标没了
  • 不格式化更改盘符
  • cocos 源码
  • Android OpenGL ES(三)----编程框架
  • extJS中常用的4种Ajax异步提交方式
  • linux中使用bash是什么意思
  • jsp下拉框跳转到相应页面
  • android view详解
  • 安卓wifi已连接不可上网设置
  • javascript命名空间
  • android 监听事件
  • python操作word文档替换文字
  • 纳税人类型税码是什么
  • 亏损企业能否给补偿
  • 国家税务总局江西省
  • 北京市注册税务师
  • 青岛市税务管理局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设