模型的图优化

2023-05-16

在这里插入图片描述

图优化

最近在整理之前的一些工作内容, 记录下来温故而知新

在各种开源推理框架中,我们总能看到有一种graph optimizer技术,主要是对用户想要运行的网络模型进行一种网络结构层面的优化,剔除不需要的Op、融合某些特定的相邻Op、转换某些框架不支持或者实现效率较低的Op等。但是目前网上貌似系统的介绍图优化方向的文章较少,本文是在整理了目前几个开源框架MNN、NCNN、ONNX-Runtime中关于图优化技术后所完成,希望能让大家对图优化有一个大略的了解。

前言

  1. 本文着重介绍是图优化,对于本文出现的Op的定义不作介绍.这些Op名可能是来自于各种框架
  2. 手画的示意图中矩形代表Op,矩形右边的一般为Op的参数信息,圆形代表tensor。字丑请见谅
  3. 一些图优化的实现是取决于推理框架自身的Op实现情况,并不是说一种推理框架的图优化就一定能用在另外一个推理框架上
  4. 每个图优化操作后面都标了来源框架,具体实现可参考下属源代码链接:MNN图优化源代码1、MNN图优化源代码2、NCNN图优化源代码、ONNX-Runtime图优化源代码
  5. 整理过程以MNN为主,然后在NCNN和ONNX-Runtime中补充MNN没有的操作

正文

Eliminations删除

  • Op本身无意义
    有些Op本身不参与计算,在推理阶段可以直接去掉对结果没有影响

    • RemoveUnusefulOp(MNN)
      包括Seq2Out,“Identity”, “NoOp”, “Print”, “Assert”, “StopGradient”, caffe的Split, Cast转换前后类型相等或者是int32、int64, Concat并且只有输入一个tensor
      在这里插入图片描述

    • RemoveDropout(MNN)
      dropout无需多言了吧

    • eliminate_noop(NCNN)
      noop是NCNN中定义的forward为空的一种Op

  • Op参数无意义
    有些Op本身是有意义的,但是设置成某些参数后就变成了无意义的了

    • TensorConverterSameMerge(MNN)
      TensorConverter是MNN里用于转换数据排布格式的Op,当参数src等于dst时该Op无意义可被删除
      在这里插入图片描述

    • Slice Elimination(ONNX-Runtime)
      当Slice Op的index_start等于0、index_end等于c-1时该Op无意义可被删除

    • Expand_Elimination(ONNX-Runtime)
      Expand Op指定的输出shape等于输入shape时该Op无意义可被删除
      在这里插入图片描述

    • eliminate_pooling1x1(NCNN)
      1x1的pooling无需多言了吧

  • Op位置无意义
    一些Op在一些特殊的位置会变得多余无意义

    • RemoveOutputTensorConvert(MNN)
      模型的输出不需要进行内存排布转换
      在这里插入图片描述

    • Unsqueeze Elimination(ONNX-Runtime)
      当Unsqueeze Op的输入是const Op时,可以将const Op进行Unsqueeze操作后直接删除Unsqueeze Op
      在这里插入图片描述

    • eliminate_orphaned_memorydata(NCNN)
      NCNN里的memorydata就是const Op,当没有其他Op将该const Op作为输入时可认为其为“孤儿”orphaned,可删除

    • eliminate_reshape_before_binaryop(NCNN)
      TODO:

    • eliminate_reshape_after_global_pooling(NCNN)
      这里的reshape是flatten,即期望reshape后的tensor的w=1,h=1,c=c,而global_pooling本身输出tensor就是w=1,h=1,c=c,因此可删除reshape
      在这里插入图片描述

    • eliminate_flatten_after_global_pooling(NCNN)
      同上

    • eliminate_flatten_after_innerproduct(NCNN)
      innerproduct就是全连接层,输出tensor在NCNN里也是w=1,h=1,c=c,因此后续的flatten可删除
      在这里插入图片描述

  • Op前后重复
    前后两个相邻的Op都是同一类时,可能只需要一个

    • RemoveDuplicateReshape(MNN)
      连续的Reshape只需要保留最后一个reshape
      在这里插入图片描述

    • RemoveDuplicatedTensorConvert(MNN)
      连续的内存排布转换只需要保留最后一个
      在这里插入图片描述

  • Op前后反义
    前后两个相邻的Op进行的操作时相反的时候这两个Op都可以删除

    • EliminateSqueezeExpandDims(MNN)
      Squeeze和ExpandDims这两个Op是反义的,一个压缩维度,一个是拓展维度,当连续的这两个Op指定的axis相等时即可同时删除这两个Op
      在这里插入图片描述

    • RemoveInverseTensorConverter(MNN)
      当连续的两个内存排布转换Op的参数前后反义,即src1等于dst2,可同时删除这两个Op
      在这里插入图片描述

    • EliminateQuantAndDequant(MNN)
      连续进行量化和反量化,可同时删除这两个Op
      在这里插入图片描述

    • Concat_Slice_Elimination(ONNX-Runtime)
      合并后又进行同样的拆分,可同时删除这两个Op
      在这里插入图片描述

  • 公共子图

    • Common_Subexpression_Elimination(ONNX-Runtime)
      当模型当中出现了公共子图,如一个输出是另外两个同类型同参数的Op的输入,则可进行删除其中一个Op.Onnx的实现说实话我没太看懂。但是理解起来和实现起来都不难。我自己实现了一版。同时这是一个经典的算法题目,公共子树,有兴趣可自行搜索
      在这里插入图片描述

Fuse融合

  • Op线性融合
    相邻的Op存在线性可融合的关系

    • ConvBiasAdd(MNN)
      Conv Op后跟着的Add Op可以加到Conv里的Bias去
      在这里插入图片描述

    • MergeBNToConvolution(MNN)
      BN合并大概是图优化里最常用和推理速度提高最大的一个操作,原理不多解释,随便一搜都有各种介绍
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • MergeScaleToConvolution(MNN)
      Conv Op后跟着的Scale Op可以乘到Conv里的Weight去
      在这里插入图片描述

    • Conv_Mul_Fusion(ONNX-Runtime)
      同上

    • Matmul_Add_Fusion(ONNX-Runtime)
      可以用gemm Op代替矩阵乘Matmul+Add,ONNX框架里的gemm公式是Y=alpha* A* B+beta* C
      在这里插入图片描述

    • Matmul_Scale_Fusion(ONNX-Runtime)
      Matmul的前或者后接一个Scale或者Div都可以融合到Matmul的相乘系数alpha里
      在这里插入图片描述

    • fuse_batchnorm_scale(NCNN)
      scale的s和b都可以直接融合到bn里去
      在这里插入图片描述

    • fuse_innerproduct_batchnorm(NCNN)
      bn层合并到全连接层。可以从两种角度看,一个是全连接层可以转成1x1 conv(这个会在下面Transformer里会介绍),bn层可以合并到conv里。另一个角度是bn层可以转换成一个scale层(这个也会在下面Transformer里介绍),然后scale可以融合到全连接层的weight里
      a = bias - slope * mean / sqrt(var + eps)
      b = slope / sqrt(var + eps)
      value = value * b + a
      在这里插入图片描述

    • fuse_innerproduct_add(NCNN)
      全连接层后的Add可以融合到全连接层的bias中
      在这里插入图片描述

  • Op激活融合
    把激活操作融合到卷积层中

    • MergeReluToConvolution(MNN)
      有些框架的激活操作和Conv操作虽然是连续但是计算过程是独立的,在推理的时候是先计算Conv层:"访问"Conv的输出位置,把计算结果放进去,output[i]=Conv(input[i])。然后再计算Relu层:第二次"访问"一遍输出位置,把Relu计算结果放进去,output[i]=Relu[i],这样其实是访问了两遍输出output,增加了访存时间降低了推理效率。如果计算出Conv的结果后立马进行Relu操作,然后把最终结果放到输出位置上,则只需要访存一次。虽然计算量不变,访存量变小,也能提高推理速度。这个优化操作需要卷积层的推理实现支持直接激活
      在这里插入图片描述

    • MergeRelu6ToConvolution(MNN)
      同上

    • Conv_Activate_Fusion(ONNX-Runtime)
      同上

  • Op const输入融合
    如果某个Op的输入包含const,则可能进行一些Op融合

    • ConstantFolding(MNN)
      常量折叠,如果一个Op的所有输入都是const时,可以先计算好结果const代替该Op,而不用每次都在推理阶段都计算一遍
      在这里插入图片描述

    • FoldExpandDimsConst(MNN)
      如果ExpandDims这个Op指定维度的输入是const,则把这个维度以参数的形式融合到ExpandDims
      在这里插入图片描述

    • fuse_memorydata_binaryop(NCNN)
      当Binary Op的第二个输入是一个const标量时,把这个标量以参数的形式融合为Binary Op的属性
      在这里插入图片描述

  • Op减少,多变一
    有些Op在一些框架上可能没有直接的实现,而是通过一些Op的组合,如果我自身的框架实现了这个Op,就可以把这些组合转成这个Op,能够使得网络图更加简明清晰

    • FuseLayerNorm(MNN)
      组合实现的Norm Op直接转换成一个Op
      在这里插入图片描述

    • FuseTfPrelu(MNN)
      组合实现的Prelu Op直接转换成一个Op
      在这里插入图片描述

    • Matmul_transpose_Fusion(ONNX-Runtime)
      有些框架的矩阵乘法Matmul层自身是不带转置操作的,当需要转置的矩阵乘法时需要前面加一个transpose层。Onnx的Matmul自身有是否转置的参数,因此可以将前面的transpose层转换为参数即可
      在这里插入图片描述

    • fuse_binaryop_eltwise(NCNN)
      x3 = x1 *b1+x2 *b2,把BinaryOp_Add转换成Eltwise_Sum,而Eltwise_Sum是有参数coeffs的,可以完成上述乘法的效果,因此把两个BinaryOp_Mul的系数融合到Eltwise_Sum的参数coeffs
      在这里插入图片描述

    • replace_reduction_with_global_pooling(NCNN)
      对一个三维tensor先后两次分别进行w维度的reduction_mean和h维度的reducetion_mean,最终只剩下c这个维度,就等于进行了一次global_mean_pooling
      在这里插入图片描述

Transformer转换

  • 一变一
    将一个Op转变成另外一个Op,这样做一般能带来性能的提升

    • ConvertMatMulToConv2D(MNN)
      将矩阵乘变成Conv,因为一般框架对Conv是做了更多的优化
      在这里插入图片描述

    • TransformInnerProduct(MNN)
      将全连接层转变成1x1 Conv,因为对Conv做了更多的优化。这个图优化应该也是用的比较多的
      在这里插入图片描述

    • TransformBatchNormal(MNN)
      BN是等价于Scale Op的,转换成Scale计算量更少,速度更快
      在这里插入图片描述

    • replace_prelu_with_leaky_relu(NCNN)
      将prelu转变成leaky_relu,对性能应该没啥影响,这么做的原因大概是因为leaky_relu比prelu更加常见吧

    • replace_convolution_with_innerproduct_after_global_pooling(NCNN)
      TODO:

    • replace_convolution_with_innerproduct_after_innerproduct(NCNN)
      TODO:

  • 一变多,为了实现
    这类图优化是与前面的融合优化里的多变一做法相反,将某Op以其他Op组合的形式代替,这样做能减少推理框架需要单独支持的Op的数量

    • TransformShuffleChannel(MNN)
      ShuffleChannel这个Op没有单独实现而是通过组合Reshape、Permute实现
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • TransformOnnxPad(MNN)
      将老版onnx的pad-2的pads从参数形式转成输入形式
      在这里插入图片描述

    • ResolveTfShapeN(MNN)
      将TF框架的ShapeN这个Op通过组合多个Shape的方式实现。
      在这里插入图片描述

    • TransformGroupConvolution(MNN)
      把组卷积通过组合Slice、Conv实现
      在这里插入图片描述

  • 内存相关

    • AddTensorFormatConverter(MNN)
      这个是由于MNN倾向采用NC4HW4(C4)的内存排布方式,而其他框架一般采用NCHW和NHWC排布方式,因此一个支持C4排布的Op和不支持C4排布的Op之间需要额外增加一个排布方式转换层。这里会涉及C4排布的概念,这里不多谈论,下次有空单独写一篇
      在这里插入图片描述

    • TurnCompabilityOpAsNC4HW4(MNN)
      MNN把Op分为三种,只支持C4的、既支持C4又支持原始排布的、只支持原始排布的,遇到第二种时尽量用C4来计算能够提升推理效率
      在这里插入图片描述

    • RemoveInplace(MNN)
      Inplace是一类Op的统称,这类Op的输入输出为同一tensor,如relu、bn等op都属于inplace,io[i]=Relu(io[i])。这样会使tensor名失去唯一性。比如relu的输入和输出tensor名为relu_tensor,那我在描述网络模型的时候将relu_tensor作为某个Op的输入时就会产生二义性,这个relu_tensor到底是经过relu的还是没有经过relu。因此需要新建一个输出tensor
      在这里插入图片描述

    • ConvertBinaryToElementwise(MNN)
      TODO:

    • BinaryAddToEltWise(MNN)
      TODO:

    • TurnBinaryToElementwise(MNN)
      TODO:

    • Transformer_Memcpy(ONNX-Runtime)
      一个const Op如果既作为一个CPU Op的输入,又作为一个GPU Op的输入,不管这个const是存储在CPU Memory里还是存储在GPU Memory里,在另一个设备计算时都会产生一次内存拷贝操作。可以选择增加一个同样的const Op,这样在初始化的时候CPU和GPU上都有这份数据,不需要进行拷贝操作,提高了推理效率
      在这里插入图片描述

  • 量化相关
    跟量化相关的几个图优化操作

    • ConvBNReluFuseToConvInt8(MNN)
      和BN、Relu好像没有任何关系,就是将多Op实现的ConvInt8转变成ConvInt8
      在这里插入图片描述

    • LSTMWeightInt8(MNN)
      把LSTM的3个const输入参数量化成int8的形式
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • Conv1dQuantToConv2dQuant(MNN)
      TODO:

思考

对模型利用上述操作逐一进行图优化的过程中,个人觉得应该是个do while的过程,即对于原始模型net进行一遍全部的图优化后得到net2,比较net和net2是否相等,如果不相等则再进行一次循环。这么做是因为可能后进行的图优化操作引入了新的可优化点,只进行一次的话可能会遗漏。但是貌似MNN的图优化流程就只是进行一次. 但是需要注意do while的操作可能某两个图优化操作会引入死循环, net和net2始终不相等.

图优化的意义是很大的, 但是可做的方向并不是很多, 就是以上列举的几类, 基本是通用的一些点加上一些跟各自框架本身定义Op实现有关的点. 所以感觉这就是图优化没有成为模型推理加速的研究热门方向的原因吧. 还有哪些遗漏的图优化操作欢迎大家补充

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模型的图优化 的相关文章

  • 基本命令+环境变量+正则表达式 --- shell脚本编程教程之一

    vim 单纯的使用vi查看文件 shell 编程常见的命令 xff1a alias 别名 给一长命令起别名 例如 xff1a alias myssh 61 34 ssh root 64 192 168 1 158 34 myssh 相当于
  • 基本的shell编程格式+简单的脚本实例 --- shell脚本编程教程之二

    温习shell编程基础的要点 xff1a 正则表达式的要点 xff1a 39 39 a 39 39 a 61 61 a aa aaa 39 43 39 grep E 39 a 43 39 61 61 grep 39 a 43 39 39 3
  • shell if条件分支编程 --- shell脚本编程教程之三

    数学运算 xff1a vim math sh a 61 1 b 61 2 c 61 a 43 2 或者 c 61 a 43 b echo c 条件判断 xff1a 格式1 if 条件 then 条件为真执行的任务 fi 格式2 fi 条件
  • VIM 常用快捷键

    转载 xff1a https www cnblogs com markleaf p 7808817 html 一 移动光标 h j k l 上 xff0c 下 xff0c 左 xff0c 右 ctrl e 移动页面 ctrl f 上翻一页
  • Qt5 对xml文件常用的操作(读写,增删改查)

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 项目配置 pro文件里面添加QT 43 61 xml include lt QtXml gt xff0c 也可以include lt QDomDocument gt 项目文件
  • Shell分支语句case···esac语法

    Shell编程 xff1a case esac多分支选择编程 也多常用于菜单选择 语法 xff1a case 值 in 模式1 command1 command2 command3 模式2 xff09 command1 command2 c
  • Ubuntu使用iptables配置防火墙提示:unrecognized service(Ubuntu配置iptables防火墙)

    Ubuntu默认安装是没有开启任何防火墙的 当使用service iptables status时发现提示iptables unrecoginzed service 意思是无法识别的服务 以下方法来自http blog csdn net l
  • CMake使用问题汇总

    cmake 指定编译类型 主要用在vs这种支持多配置的集成开发环境中 xff0c 可以在CMakeLists txt中指定 xff0c 也可以在CLI中指定 测试的时候发现在CMakeLists txt定义时不能使用自定义类型 xff0c
  • Shell编程,shift参数操作

    shift参数操作 xff0c 是将参数从左到右逐个移动 比如 xff1a 现在有 1 2 3 4 5 几个参数 shift操作后 xff0c 1被处理过之后 xff0c 2变为 1 3变为 2 4变为 3 5变为 4 就这样依次变动 sh
  • Java入门总览

    Java入门总览 1 JDK的安装 可以去官网下载 xff0c 有各种平台和各种版本的软件 目前常用的 xff0c 网上介绍多的大都是jdk1 8 0 211此版本 Linux系统和Windows系统安装起来都很方便 2 环境变量的配置 配
  • 示例:Linux应用程序遍历当前系统的PCI设备

    使用应用程序遍历设备上的所有PCI设备 xff0c 通过遍历这些设备 xff0c 可以获取到每个设备对应的bus号 xff0c dev号 xff0c func号 xff0c 以及每个PCI设备的额vendorID和deviceID 示例程序
  • 示例:Linux设备属性节点驱动,以及cat, echo操作

    在写Linux字符驱动的时候 xff0c 经常涉及到一些驱动需要在 sys目录或子目录下创建 xff0c 一个属性节点 xff0c 以便与 xff0c 不用查看驱动的版本信息 xff0c 时间等等一些属性信息 xff0c 以判断驱动程序加载
  • 一个双非学校的本科生的春招经历

    截止到目前各大公司的校招也已经基本进入尾声 xff0c 在这场春招中我也试着投递了几家公司 xff0c 但是效果不是太好 先说我投递的第一家 腾讯 xff0c 参加腾讯的笔试之前根本没有参加过任何相关的公司招聘的线上笔试 xff0c 这是我
  • C++多态的实例

    1 1 多态的概念 简单理解 xff1a 同一个接口 xff0c 多种实现方式 xff0c 让不同类的的对象对同一件事情可以采用不同方法去做 1 2 多态的作用 xff08 1 xff09 应用程序可以不必为一个派生类编写功能调用 xff0
  • Linux下的多进程编程——fork(),exec()等函数的使用

    Linux下的多进程编程初步 1 引言 对于没有接触过Unix Linux操作系统的人来说 xff0c fork是最难理解的概念之一 xff1a 它执行一次却返回两个值 fork函数是Unix系统最杰出的成就 之一 xff0c 它是七十年代
  • APM学习--Skywalking安装(5.0.0版本)

    Requirements JDK 6 43 xff08 instruments application can run in jdk6 xff09 JDK8 SkyWalking collector and SkyWalking WebUI
  • FreeRTOS消息队列

    FreeRTOS消息队列 队列又称消息队列 xff0c 是一种常用于任务间通信的数据结构 xff0c 队列可以在任务与任务间 中断和任务间传递信息 xff0c 实现了任务接收来自其他任务或中断的不固定长度的消息 xff0c 任务能够从队列里
  • 嵌入式前景怎么样

    现在物联网的发展也把之前大家没有注意过的嵌入式给带动起来了 xff0c 其实想去学习嵌入式的人还真不少 xff0c 不过这其中也会有人担心自己的发展前景 xff0c 下面可以一起先来了解下嵌入式前景怎么样 目前 xff0c 嵌入式开发人才需
  • datax同步数据:数据源:mongo,目标源:hdfs

    一 配置文件mongo hdfs json 34 job 34 34 setting 34 34 speed 34 34 channel 34 2 34 content 34 34 reader 34 34 name 34 34 mongo

随机推荐

  • 做程序媛这几年,感受?体验?

    首先 感受 和男程序员一个样 真不是废话 BUG是修不完的 但是不能放过它 因为你的内心会遭受煎熬 直接进入体验 就不用重复的文字去啰嗦了 直接上图哈 以下的这几种情况 在我的生活中 是真的不断出现 连样式都没变过 first 修电脑AND
  • 天猫精灵与oauth的认证接入流程(AliGenie智能家居接入流程)

    写在前面的叨叨 xff1a 对于天猫精灵的对接网上的教程也是颇少的 xff0c 所以希望我的记录过程也能对他人学习有所帮助 xff0c 要想学一样新的技术必须得找到相关技术文章好好专研了 xff0c 在学习的路上孜孜不倦 xff0c 偶遇难
  • 致敬2016年我的每一次选择。

    2016年 对我来说 是不平凡的 不是因为经历了什么永生难忘的经历也不是因为我做了什么伟大的事情 只是因为毕业了 我毕业了 多么开心却又悲伤的故事 我开心在我终于可以做自己想做的事情 悲伤的是当同学们的父母都陆续为他们铺好以后的路的时候 我
  • 打开计算机的管理需要在控制面板中创建关联

    今天在工作中发现当我选择计算机 管理时提示我需要在控制面板中创建关联 xff0c 如下图所示 xff1a 于是 xff0c 我便上百度搜索了一下 xff0c 答案是这样的 xff1a 修改 span style font family no
  • ftp身份认证时登录框反复弹出以及ftp常用配置

    1 若我们想访问一个人的ftp站点 xff0c 直接通过浏览器直接访问就可以了 xff08 ftp 要访问主机A的IP地址 xff09 如果对方开启了基本身份认证的话 xff0c 我们就需要输入正确的用户名及密码才可正常访问 xff0c 即
  • Linux下挂载U盘、ISO、光盘、rpm

    1 挂载U盘 1 xff09 将U盘连接到虚拟机后 xff0c 使用fdisk l xff08 注意 xff0c 这是list单词的首字母l xff09 命令查看当前U盘的设备符号 2 xff09 创建目录 mnt usb xff0c 以备
  • unity 3D学习日记:创建一个小场景并编写简单C#移动脚本

    学习Unity 3D第一周 xff0c 完成的目标一是创建一个小场景 xff0c 用角色控制器在场景里行走 xff1b 二是编写一个简单的移动脚本 一 创建一个小场景 xff0c 用角色控制器在场景里行走 1 先安装Unity 3D 5 3
  • 基于Unity3D平台的三维虚拟城市研究与应用

    0 引 言 随着现代城市的不断拓展延伸 城市空间多层次 立体模式管理逐渐成为城市规划管理的发展趋势 1 实现城市空间信息管理模式从二维到三维的转变 三维虚拟城市技术 已经成为人们关注和研究的热点 2 三维虚拟系统具有多维信息处理 表达和分析
  • unity:C#控制人在真实环境中行走

    自己在学习unity的课程中遇到了 xff0c 有的地方还没怎么太理解上去 xff0c 先做个笔记 xff0c 顺便看看有没有需要的人 1 搭建一个小场景 xff0c 一个需要控制的 人 xff08 添加CharacterControlle
  • unity 3D:自动寻路

    首先 xff0c 搭建一下场景 xff0c 场景要求 xff1a 有遮挡 xff0c 设置好不可走区域为navigation static 以及 not walkable 在人身上添加Nav Mesh Agent 设置好后勾选显示导航网格
  • 数据结构 ——c++实现(知识点集合)

    数据结构 c 43 43 实现 xff08 知识点集合 xff09 某不知名学狗的复习记录 xff0c 包含数据结构基本概念 xff0c 线性表 xff0c 栈 队列 递归 xff0c 串 数组 广义表和树和森林内容整理 主要整理了知识点
  • Unity3D 使用SceneManager跳转/加载场景

    很久没有更新博客了 xff0c 最近也是还在学习U3D 下面写一下使用SceneManager跳转 加载场景 我们假设要点击一个按钮跳转 xff0c 那么我们只要把跳转的代码写进按钮点击事件里就好了 其实加载场景很简单 xff0c 只需要写
  • [OpenCV] aruco Markers识别 小车巡线

    小车巡线代码 include lt ros ros h gt include lt sensor msgs Image h gt include lt geometry msgs Twist h gt include lt cv bridg
  • 备份ubuntu

    在使用Ubuntu之前 xff0c 相信很多人都有过使用Windows系统的经历 如果你备份过Windows系统 xff0c 那么你一定记忆犹新 xff1a 首先需要找到一个备份工 具 通常都是私有软件 xff0c 然后重启电脑进入备份工具
  • Docker - docker build 命令详解

    docker build 命令原理 docker build 命令从 Dockerfile 和上下文构建镜像构建的上下文 xff1a 位于指定 PATH 或 URL 中的一组文件构建过程可以引用上下文中的任何文件 xff0c 例如 xff0
  • RealSense二次开发

    转载 xff1a librealsense2查看相机设备信息 JavaShuo 文章目录 1 librealsense2设备信息读取 xff12 xff0e realsense 投影函数和反投影函数3 深度相机与彩色相机的坐标变换 1 li
  • 大规模MIP的精确算法和实现

    大规模MIP的精确算法和实现 大规模MIP的精确算法和实现 xff1a 目录第1部分 xff1a CPLEX的Java API详解1 CPLEX简介2 构建简单的模型3 CPLEX的高级应用 第2部分 xff1a Gurobi的Python
  • 两种Dockerfile文件配置

    注意 xff1a xxx是您的项目名称 xff01 Xmx xff1a 堆最大值 xff1b Xms xff1a 堆初始值 COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中 而ADD指令还支持通过URL从远程
  • 网络编程-----在线词典项目(服务器)

    服务器端 span class token macro property span class token directive keyword include span span class token string lt stdio h
  • 模型的图优化

    图优化 最近在整理之前的一些工作内容 记录下来温故而知新 在各种开源推理框架中 xff0c 我们总能看到有一种graph optimizer技术 xff0c 主要是对用户想要运行的网络模型进行一种网络结构层面的优化 xff0c 剔除不需要的