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

  • qq宠物怎么弄出来(qq宠物怎么弄出来2021手机)

    qq宠物怎么弄出来(qq宠物怎么弄出来2021手机)

  • 如何屏蔽微信群消息但不退出群(如何屏蔽微信群聊消息)

    如何屏蔽微信群消息但不退出群(如何屏蔽微信群聊消息)

  • 华为nova5z多大尺寸(华为nova5z长宽多少cm)

    华为nova5z多大尺寸(华为nova5z长宽多少cm)

  • 小米手机安装不了网易云音乐(小米手机安装不了应用宝怎么办)

    小米手机安装不了网易云音乐(小米手机安装不了应用宝怎么办)

  • 5g关键技术到底有哪些(5g关键技术到底有哪些人家题)

    5g关键技术到底有哪些(5g关键技术到底有哪些人家题)

  • 腾讯课堂回放保留几天(腾讯课堂回放保存多久)

    腾讯课堂回放保留几天(腾讯课堂回放保存多久)

  • aqm-aloo是什么型号(AQM-ALOO是什么型号手机)

    aqm-aloo是什么型号(AQM-ALOO是什么型号手机)

  • 苹果7p重启是哪两个键(7p重启机哪里毛病)

    苹果7p重启是哪两个键(7p重启机哪里毛病)

  • cor-tl10是什么型号(cor-l00)

    cor-tl10是什么型号(cor-l00)

  • 无法对多重区域执行操作(无法对多重区域执行操作怎么解决粘贴)

    无法对多重区域执行操作(无法对多重区域执行操作怎么解决粘贴)

  • qq友谊小船是互相的吗(qq友谊小船是互动游戏吗)

    qq友谊小船是互相的吗(qq友谊小船是互动游戏吗)

  • 手机耳机的麦克风在电脑上面为什么不能用(手机耳机的麦克风)

    手机耳机的麦克风在电脑上面为什么不能用(手机耳机的麦克风)

  • 1108打印机用什么硒鼓(1108打印机用什么碳粉)

    1108打印机用什么硒鼓(1108打印机用什么碳粉)

  • 不是群主怎么删除成员(不是群主怎么删除群相册)

    不是群主怎么删除成员(不是群主怎么删除群相册)

  • h81主板配什么内存(h81主板哪个型号好)

    h81主板配什么内存(h81主板哪个型号好)

  • fx6350最高配什么显卡(fx6350cpu参数)

    fx6350最高配什么显卡(fx6350cpu参数)

  • 苹果手机打电话的同时还可以发微信?(苹果手机打电话就黑屏是怎么回事)

    苹果手机打电话的同时还可以发微信?(苹果手机打电话就黑屏是怎么回事)

  • 钉钉老师可以打开学生的摄像头吗(钉钉老师可以打开摄像头吗)

    钉钉老师可以打开学生的摄像头吗(钉钉老师可以打开摄像头吗)

  • 电脑开不起机怎么办(电脑开不起机怎么把东西删了)

    电脑开不起机怎么办(电脑开不起机怎么把东西删了)

  • ps海绵工具有什么用(ps海绵工具快捷键是什么)

    ps海绵工具有什么用(ps海绵工具快捷键是什么)

  • 内存储器的容量是指(内存储器的容量是由________总线的宽度确定的)

    内存储器的容量是指(内存储器的容量是由________总线的宽度确定的)

  • 苹果手表s4和s5区别(苹果手表s4和s5的区别)

    苹果手表s4和s5区别(苹果手表s4和s5的区别)

  • 回收站清空了怎么恢复(回收站清空了怎么防止恢复)

    回收站清空了怎么恢复(回收站清空了怎么防止恢复)

  • 怎样判断电脑主板坏了(怎样判断电脑主板坏了没有)

    怎样判断电脑主板坏了(怎样判断电脑主板坏了没有)

  • 抖音转发了有记录吗(转发抖音视频会有记录吗)

    抖音转发了有记录吗(转发抖音视频会有记录吗)

  • mate10如何升级9.1(mate10如何升级鸿蒙2.0)

    mate10如何升级9.1(mate10如何升级鸿蒙2.0)

  • 黑鲨手机开发者选项在什么地方(黑鲨手机开发者模式)

    黑鲨手机开发者选项在什么地方(黑鲨手机开发者模式)

  • 复制快捷键ctrl加什么介绍(复制快捷键ctrl+c)

    复制快捷键ctrl加什么介绍(复制快捷键ctrl+c)

  • 应交增值税已交税金是什么意思
  • 一般计税方法和简易计税方法的计算公式
  • 简易计税是什么意思?
  • 月末计提无形资产的折旧
  • 三免三减半如何申报企业所得税
  • 一般企业需要缴纳的税种
  • 固定资产明细账怎么填
  • 增值税留抵退税政策2022
  • 净利润提盈余公积
  • 员工对公司造成损失的,可以起诉吗
  • 办企业房权证费用多少
  • 外地预缴个人所得税如何入账及申报
  • 建筑企业预交增值税问题尚未得到解决
  • 企业合并报表后为何要抵消盈余公积补提?
  • 收到委托代销清单,确认收入的会计分录
  • 货物分批付款会计处理
  • 电商刷单支付的佣金会计分录
  • 账上少了25元怎么做账
  • 差额征收增值税如何申报
  • 支付境外关联方借款利息需要的
  • php 生成opcode
  • php中提交表单数据
  • 房地产资质代理公司排名
  • mac如何改变照片图库
  • 跨年度费用应如何计算
  • esafec.dll是什么东西
  • el-input value
  • 最高像素的镜头是多少
  • yolo 源码
  • 苏门答腊岛海岸线多少
  • 债券投资账务处理例题
  • 增值税检查的内容
  • vue3配置文件
  • 100多年前程序员
  • Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
  • 外省人员收入怎么查
  • 商铺转让费的会计分录
  • 管理费用的借贷科目
  • 购买商品或服务的人称为
  • 费用结转的方法有哪些
  • 事务所企业所得税
  • 所得税预缴申报表中营业成本怎么计算
  • 企业管理费用科目期末一般是
  • 免交的增值税要交所得税吗
  • 预收账款退款的会计处理
  • 折旧方法有哪些英文
  • 生产成本核算的步骤
  • 超过保质期放冰箱还能吃吗
  • 电脑配件入账
  • 小微企业营业外收入二级科目怎么
  • 多计费用以前年度损益调整账务处理
  • 预付卡销售和充值怎么做账
  • 应收账款多收了退回怎么做账
  • 为什么营业成本属于费用
  • mysql存储过程中调用存储过程
  • win8/10whql
  • 怎么看mac的硬盘型号
  • mac红
  • win8系统打开软件闪退
  • Ubuntu系统怎么设置IP
  • Ubuntu如何安装软件
  • centos中netspeeder网络加速/优化器的安装方法
  • linuxnamespace入门
  • linux升级python2.7
  • dos命令 for
  • socketjs-node/info
  • python运行py文件没反应
  • 缓动函数网站
  • 微信内置浏览器怎么清除缓存
  • js数组操作方法
  • android 加载大量图片
  • 用js实现类的方法
  • jquery课程内容总结
  • Android中使用HttpURLConnection和HttpClient实现GET和POST请求访问网络
  • jquery弹出页面窗口
  • 卷烟批发环节的消费税税率
  • 资产划转是什么会计科目
  • 电子专票红字信息表
  • 十四五时期税收制度
  • 江苏个人扣税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设