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

  • 微信可以申请小号了吗(微信可以申请小号别人还能搜到吗)

    微信可以申请小号了吗(微信可以申请小号别人还能搜到吗)

  • 三星watch4可以测血压吗(三星watch4可以测血糖吗)

    三星watch4可以测血压吗(三星watch4可以测血糖吗)

  • oppo手机出现耳机模式怎么取消(oppo手机出现耳机没声音是什么情况)

    oppo手机出现耳机模式怎么取消(oppo手机出现耳机没声音是什么情况)

  • 荣耀x10和荣耀30的区别有哪些(荣耀x10和荣耀30青春版哪个好)

    荣耀x10和荣耀30的区别有哪些(荣耀x10和荣耀30青春版哪个好)

  • 华为nove7与nove7se的区别是什么(华为nove7与nove8的区别)

    华为nove7与nove7se的区别是什么(华为nove7与nove8的区别)

  • 苹果可以传软件给苹果吗(苹果可以传软件的应用叫什么)

    苹果可以传软件给苹果吗(苹果可以传软件的应用叫什么)

  • 抖音该视频搬运是什么意思(抖音视频搬运被原作者举报)

    抖音该视频搬运是什么意思(抖音视频搬运被原作者举报)

  • 腾讯会议静音后放音乐别人能听到吗(腾讯会议静音后录屏有声音吗)

    腾讯会议静音后放音乐别人能听到吗(腾讯会议静音后录屏有声音吗)

  • windows pin是什么(windows pin是什么意思)

    windows pin是什么(windows pin是什么意思)

  • 开飞行模式能看离线视频吗(开飞行模式能看见未接电话吗)

    开飞行模式能看离线视频吗(开飞行模式能看见未接电话吗)

  • 手机卡放到另一个手机上没有联系人的原因(手机卡放到另一个手机上微信聊天记录可以恢复吗)

    手机卡放到另一个手机上没有联系人的原因(手机卡放到另一个手机上微信聊天记录可以恢复吗)

  • 爱奇艺登录失效原因(爱奇艺登录失效是被踢了吗 ipad)

    爱奇艺登录失效原因(爱奇艺登录失效是被踢了吗 ipad)

  • oppo系统更新后变卡了怎么办(OPPO系统更新后游戏空间没了)

    oppo系统更新后变卡了怎么办(OPPO系统更新后游戏空间没了)

  • 免打扰模式电话打的进去吗(免打扰模式电话能打进来吗)

    免打扰模式电话打的进去吗(免打扰模式电话能打进来吗)

  • tcp ip协议包含哪几层(tcpip协议包含哪五层)

    tcp ip协议包含哪几层(tcpip协议包含哪五层)

  • word字体变大快捷键(word字体变大按什么键)

    word字体变大快捷键(word字体变大按什么键)

  • word怎么弄密封线(word文档怎么设置密封线)

    word怎么弄密封线(word文档怎么设置密封线)

  • 苹果x几千万像素(苹果x的像素相当于安卓的多少万像素)

    苹果x几千万像素(苹果x的像素相当于安卓的多少万像素)

  • volte拨打视频通话方法

    volte拨打视频通话方法

  • 手机qq拉黑后怎么恢复(手机qq拉黑怎么恢复好友)

    手机qq拉黑后怎么恢复(手机qq拉黑怎么恢复好友)

  • 快手黑屏闪退怎么回事(快手黑屏自动关闭怎么处理)

    快手黑屏闪退怎么回事(快手黑屏自动关闭怎么处理)

  • bm4a电池是什么手机(电池bm4v)

    bm4a电池是什么手机(电池bm4v)

  • oppoFindx呼吸灯怎么设置(oppo findx3呼吸灯)

    oppoFindx呼吸灯怎么设置(oppo findx3呼吸灯)

  • oppo17上市时间(oppor17什么时候出来的)

    oppo17上市时间(oppor17什么时候出来的)

  • qq阅读下载的书在哪里看(qq阅读下载的书怎么导出到mp4)

    qq阅读下载的书在哪里看(qq阅读下载的书怎么导出到mp4)

  • 显示器转拼接屏上为何会变虚(2019拼接显示器)

    显示器转拼接屏上为何会变虚(2019拼接显示器)

  • 商品混凝土税率为啥是3%
  • 对账结算流程
  • 代扣代缴个人所得税有滞纳金吗
  • 一年房租正常摊销多少
  • 物业费按年交有优惠吗
  • 社团费用报销制度
  • 对公账户汇款方式
  • 固定资产租入租金计入什么科目
  • 员工报销会计分录怎么做
  • 财务报表其他应付款为负数
  • 运输费可以和货款合并开票吗
  • 超额库存现金
  • 普通年金的定义
  • 社保公积金会计分录怎么写
  • 安装费发票开具3%税率国税需要备案吗?
  • 企业如何处理劳方与资方的关系
  • 增票丢失怎么开完税证明
  • 国税未核定税种怎么处理
  • 购买税控系统专用设备
  • 其他收益小企业会计报表没有怎么填
  • 员工休产假期间公司发工资吗
  • 道路工程施工机械
  • bios设置启动顺序(图解说明)
  • 信息化生产力是指什么
  • 企业取得财政拨款怎么算
  • 结转已售材料成本600元会计分录
  • win11打开图片
  • 电脑上加速网页的加速器
  • 京东预付卡怎么做账
  • php函数function
  • linux命令tar zcvf
  • mtask.exe - mtask是什么进程 有什么用
  • 广告公司的设计服务费计入什么科目
  • 资产等于负债加所有者权益
  • java中怎么连接数据库
  • 自学黑客技术入门教程
  • 最新前端面试题
  • node.js最新版本
  • 苹果cmsv10官网
  • 对供应商的罚款通知怎么写
  • 建筑业总包增值税
  • 金蝶软件怎么查银行科目明细
  • 住宿费补贴
  • 电商行业退货退款流程
  • 税控盘维护费每年都要交吗
  • 增值税发票如何作废流程
  • sql中的row_number
  • 合同金额含税么
  • 实收资本变化
  • 公司固定资产抵押贷款无法偿还
  • 闽侯县安置房交易缴纳土地出让金
  • 用留存收益筹资为什么没有占用费
  • 2018年小规模纳税人
  • 公司货物发票进项高开还是低开
  • 汽车折旧年限与折旧率
  • 什么样的发票公司可以开
  • 公司购买电缆线用于修缮厂房
  • 账面余额与账面净值
  • 如何申请高新技术企业认定
  • 总账和明细账的区别与联系
  • mysql冗余字段
  • mysql的事务处理
  • 世界杯猜测
  • win7安装mysql5.5
  • IPad怎么连接电视机看看影视
  • ghost怎么安装gho文件
  • xp无法识别的usb设备unknown device
  • window10虚拟系统
  • giantantispywaremain.exe是什么进程 有什么作用 giantantispywaremain进程查询
  • win10周年更新版是什么意思
  • win7无法删除d盘
  • win8怎么系统重装系统
  • 快捷方式栏在哪
  • Win10 Mobile 10586.71截图曝光 修复已知问题
  • js中script标签的作用
  • js数组如何定义
  • js基于什么
  • 个体工商户定期定额核定
  • 税务守信激励典型案例
  • 通辽这个地方怎么样
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设