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

  • excel文件怎么加密码(excel文件怎么加密如何只读)

    excel文件怎么加密码(excel文件怎么加密如何只读)

  • qq在哪设置声纹气泡(qq在哪设置声音)

    qq在哪设置声纹气泡(qq在哪设置声音)

  • 西瓜视频怎么开通橱窗功能(西瓜视频怎么开店铺)

    西瓜视频怎么开通橱窗功能(西瓜视频怎么开店铺)

  • 评论被折叠是什么意思(评价被折叠是违规吗)

    评论被折叠是什么意思(评价被折叠是违规吗)

  • iphone无服务 如何解决(iphone 手机 无服务)

    iphone无服务 如何解决(iphone 手机 无服务)

  • 抖音视频上方区域怎么加文字(抖音右上角视频)

    抖音视频上方区域怎么加文字(抖音右上角视频)

  • 淘宝买家用手机怎么看周月(淘宝买手机有风险吗)

    淘宝买家用手机怎么看周月(淘宝买手机有风险吗)

  • 手机录音最多能录多长时间(手机录音最多能用多长时间)

    手机录音最多能录多长时间(手机录音最多能用多长时间)

  • 小米10青春版和oppoa92s对比(小米10青春版和oppok9x哪个好)

    小米10青春版和oppoa92s对比(小米10青春版和oppok9x哪个好)

  • 拼多多好友聊天在哪(拼多多好友聊天记录别人能看见吗)

    拼多多好友聊天在哪(拼多多好友聊天记录别人能看见吗)

  • 苹果电脑系统和windows系统区别(苹果电脑系统和window的区别)

    苹果电脑系统和windows系统区别(苹果电脑系统和window的区别)

  • 拼多多怎么隐藏订单(拼多多怎么隐藏手机号和姓名)

    拼多多怎么隐藏订单(拼多多怎么隐藏手机号和姓名)

  • iphonexsmax截图快捷键(苹果xsmax截图)

    iphonexsmax截图快捷键(苹果xsmax截图)

  • 快手直播管理员有几个(快手直播管理员能看到观众昵称吗)

    快手直播管理员有几个(快手直播管理员能看到观众昵称吗)

  • ipad能安装万能钥匙吗(ipad可以下载万能wifi吗)

    ipad能安装万能钥匙吗(ipad可以下载万能wifi吗)

  • 增强信息收费吗(华为手机增强信息收费吗)

    增强信息收费吗(华为手机增强信息收费吗)

  • 京东如何取消订单退款(京东如何取消订单拦截)

    京东如何取消订单退款(京东如何取消订单拦截)

  • vedioleap怎么卡点(video star卡点)

    vedioleap怎么卡点(video star卡点)

  • 苹果原装充电器鉴别(苹果原装充电器发烫严重怎么回事?)

    苹果原装充电器鉴别(苹果原装充电器发烫严重怎么回事?)

  • 我是谜怎么开不了麦(我是谜怎么没有了)

    我是谜怎么开不了麦(我是谜怎么没有了)

  • 快手小黄车是什么意思(快手小黄车是什么软件)

    快手小黄车是什么意思(快手小黄车是什么软件)

  • linux 防御SYN攻击步骤详解(linux系统应对攻击的常用防御手段的描述)

    linux 防御SYN攻击步骤详解(linux系统应对攻击的常用防御手段的描述)

  • vue返回上一页自动刷新方式(vue实现返回顶部)

    vue返回上一页自动刷新方式(vue实现返回顶部)

  • 小迪安全day08信息收集-架构,搭建,WAF(小迪安全2021)

    小迪安全day08信息收集-架构,搭建,WAF(小迪安全2021)

  • 企业所得税更正申报要交滞纳金吗
  • 税后净营业利润和净利润的区别
  • 公司支付宝账户要交税吗
  • 公司不交工会经费的原因,风险说明
  • 什么是资产负债率
  • 增值税发票税号0和O
  • 专票没有税点
  • 支票罚金
  • 递延收益为什么是非流动负债
  • 国有资产转让房产
  • 怎么理解捐赠支出税前扣除标准计算口径
  • 出口专用发票应在哪里开
  • 个人经营贷款利率是多少
  • 取得虚开增值税专票如何税务处理
  • 公司购入汽车应交什么税
  • 税金及附加与期间费用区别
  • 税务大厅补报个税怎样申报
  • 施工企业开专票还是开普票好
  • 合理工资薪金的确认原则
  • 小规模纳税人交企业所得税吗
  • 特种设备培训费计入什么会计科目
  • 房地产开发企业资质证书
  • 上年度的发票还能红冲吗
  • 前端实现拖拽拉动图片
  • Linux中stat命令显示文件的基本使用教程
  • PHP简单实现HTTP和HTTPS跨域共享session解决办法
  • 冲减应收账款的分录
  • 竞业限制违反了怎么办
  • 个人转让门面的法律规定
  • php文件包含的4种方式
  • 库存现金盘亏处理流程
  • 扣缴单位无有效的税费种认定信息
  • IIS 7.5 asp Session超时时间设置方法
  • php事务特性
  • pytorch开源项目
  • ps怎么弄树
  • 2022年windows11windows10最强VMware Workstation 16 Pro for Windows虚拟机软件最新授权版16.2.3-19376536版本
  • 转增资本属于什么会计科目
  • 日记账的定义
  • 投资他人公司
  • 一字节的范围
  • antd pro v5
  • 小规模纳税人免增值税的账务处理
  • 哪些人可以享受职业培训补贴
  • 未确认融资费用摊销额怎么计算
  • 收到政府扶贫款如何做分录
  • 以摊余成本计量的债权投资与以公允价值计量且其变动
  • 原材料专票入库怎么入账
  • 已付预付款当月怎么入账
  • 其他债权投资的公允价值变动计入什么科目
  • 增值税一般纳税人是什么意思
  • 如何计提本年度工资总额
  • 银行承兑的购买
  • 关于文化事业建设费的说法错误的是
  • 金蝶暂存凭证怎样转正常凭证
  • 汽车折旧计算方法2023折旧率
  • session入库有什么好处
  • mysql工作内容
  • win8.1无法进入系统
  • 部署与布署哪个正确
  • bios界面uefi
  • windows附件在哪里打开
  • mac如何整理桌面图标
  • linuxzen
  • lsm.exe是什么进程
  • 批处理命令大全及用法
  • vue打包页面空白
  • Android: netd中DnsProxyListener的简单介绍
  • python程序讲解
  • UNITY gameobject代码中setacvtive(false)与面板中直接去掉勾 效果不一样
  • python3.10性能
  • python多层嵌套列表制作
  • 重庆市委常委是副部级干部吗?
  • 社保逾期未申报会造成什么影响,要怎么处理
  • 消费税征税环节
  • 税控盘抵税申报表怎么填
  • 怎么查询手机发票
  • 广东税务查询系统
  • 误餐费报销管理办法
  • 下列哪些表述是正确的( )
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设