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

  • 交管12123怎么绑定车辆(交管12123怎么绑定货车)

    交管12123怎么绑定车辆(交管12123怎么绑定货车)

  • 荣耀9x的屏幕刷新率是90hz吗(荣耀9x的屏幕刷新率高吗)

    荣耀9x的屏幕刷新率是90hz吗(荣耀9x的屏幕刷新率高吗)

  • 华为mate30在中国上市的时间(华为mate30中国销量)

    华为mate30在中国上市的时间(华为mate30中国销量)

  • 小米mix2指纹设置消失(小米mix2s 指纹)

    小米mix2指纹设置消失(小米mix2s 指纹)

  • 微信语音通话有辐射吗(微信语音通话有录音备份吗)

    微信语音通话有辐射吗(微信语音通话有录音备份吗)

  • 更新驱动程序会怎样(更新驱动程序会丢失文件吗)

    更新驱动程序会怎样(更新驱动程序会丢失文件吗)

  • win10打印机打印没反应(win10打印机打印不出来是什么原因)

    win10打印机打印没反应(win10打印机打印不出来是什么原因)

  • 移动硬盘是固态硬盘还是机械硬盘(移动硬盘是固态硬盘和机械硬盘哪个好)

    移动硬盘是固态硬盘还是机械硬盘(移动硬盘是固态硬盘和机械硬盘哪个好)

  • fyuse是什么应用(fyuse是什么意思)

    fyuse是什么应用(fyuse是什么意思)

  • 小米手机上网速度慢的解决方法(小米手机上网速度显示)

    小米手机上网速度慢的解决方法(小米手机上网速度显示)

  • android设备登录是什么手机(Android设备登录是什么手机)

    android设备登录是什么手机(Android设备登录是什么手机)

  • 人工分页符是硬分页符吗(人工分页符会随文章)

    人工分页符是硬分页符吗(人工分页符会随文章)

  • 闲鱼上的超赞能删除吗(闲鱼超赞给钱是真的吗)

    闲鱼上的超赞能删除吗(闲鱼超赞给钱是真的吗)

  • iwatch5蜂窝版要插卡吗(apple watch蜂窝版需要另外付费吗)

    iwatch5蜂窝版要插卡吗(apple watch蜂窝版需要另外付费吗)

  • 一个人可以注册几个抖音账号(一个人可以注册几家公司)

    一个人可以注册几个抖音账号(一个人可以注册几家公司)

  • 苹果x怎么调画面清晰度(苹果x画中画怎么设置)

    苹果x怎么调画面清晰度(苹果x画中画怎么设置)

  • vivo设置单个人铃声(vivo如何单独设置锁屏壁纸)

    vivo设置单个人铃声(vivo如何单独设置锁屏壁纸)

  • 荣耀20怎么看运行内存(荣耀怎么看运行内存还剩多少)

    荣耀20怎么看运行内存(荣耀怎么看运行内存还剩多少)

  • 苹果11超取景框设置(苹果11超取景框用不了)

    苹果11超取景框设置(苹果11超取景框用不了)

  • 手机相册在电脑上是哪个文件夹(手机相册在电脑里英文是)

    手机相册在电脑上是哪个文件夹(手机相册在电脑里英文是)

  • 立刷注册了可以注销吗(立刷注册过还能注册吗)

    立刷注册了可以注销吗(立刷注册过还能注册吗)

  • 美团账户余额在哪里(美团 余额)

    美团账户余额在哪里(美团 余额)

  • airpods美版和国行区别(airpods美版和国行序列号)

    airpods美版和国行区别(airpods美版和国行序列号)

  • b站隐私设置禁止回复(b站隐私设置禁止私信)

    b站隐私设置禁止回复(b站隐私设置禁止私信)

  • 微信拉黑的人在哪里解除(微信拉黑的人在群里说话能看到吗)

    微信拉黑的人在哪里解除(微信拉黑的人在群里说话能看到吗)

  • 转租仓库交增值税吗
  • 购买产品再出售怎么入账
  • 发票勾选错了已报税怎么办
  • 公允价值下降属于资产吗
  • 企业收入为0要报企业所得税吗
  • 工伤私了赔偿
  • 某公司是一家刚成立的大型化妆品生产企业
  • 优惠券抵扣账务处理流程
  • 应收账款增值税专用发票
  • 受托加工物资产包括哪些
  • 往来款少付零头怎么入账
  • 退休人员返聘工资交个人所得税标准
  • 差旅补助是否并入工资
  • 投资收益率如何确定
  • 企业爱心捐赠可以抵相应的税吗
  • 房地产公司销售自建房怎么纳税
  • 贸易公司所得税率多少
  • 红字发票如果开多了下个月能进行抵扣么?
  • 生产企业原材料的订购与运输建模
  • 办公用品普通发票的会计分录
  • 如何核对往来账明细
  • 商品损耗怎么做会计分录
  • 激活windows11怎么激活
  • 银行承兑汇票贴现率是多少
  • 电脑运行时cpu温度
  • 计提劳务派遣人员社保收到发票后没有付款的会计分录
  • 系统之家有没有官网
  • 向股东借款作为股东借款
  • 企业发生的哪些费用可以结转
  • dae是什么文件
  • laravel 分层
  • uniapp官方教程
  • redis相关
  • web搜索与挖掘
  • ps怎么把文字单独抠出来
  • 帝国cms配置数据库
  • 什么是企业所得税收入
  • web cms漏洞
  • 发票临时增量好难
  • 其他收益结转到什么账户
  • 房产公司业务招待费扣除政策
  • 出售其他债权投资产生的收益为什么计入留存收益
  • 增值税报表附表三
  • 怎么计算城市
  • 财政拨款公司的资金来源
  • 暂估入库的商品作暂估冲红会计分录
  • 对于银行已入账企业未入账的未达账项应该
  • 购入商品货款尚未支付
  • 报销单与发票金额不符看什么
  • 存货期末计量按什么分类
  • 哪些单位需要缴纳残疾人保障金
  • 年终结账账务处理
  • 三种实现方法实现的特点
  • mysql进阶之路
  • sql触发器使用存储过程
  • centos下载与安装
  • 如何更改centos的语言
  • Windows移动中心里没有无线网络
  • rtlrack.exe - rtlrack是什么进程 有什么用
  • windows2008域
  • window10如何修改电脑名称
  • linux入门知识
  • cocos2dx 3.17
  • cocos2d android
  • 英语中our和my的区别
  • javascript 基础
  • ml命令
  • Node.js中的什么模块是用于处理文件和目录的
  • vue alain
  • 浅谈jquery中next与siblings的区别
  • android内存使用情况
  • shell 字符串比较
  • python的idle打不开解决办法
  • Ubuntu、Linux Mint一键安装Chrome浏览器的Shell脚本分享
  • js 编程
  • 广东电子税务局官网登录入口
  • 国税局国家公务员工资待遇
  • 河南十大纳税公司
  • 种花需要
  • 小规模纳税人达到一般纳税人标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设