CNN图像分割简史:从R-CNN到Mask R-CNN(译)

2023-05-16

 

一直想总结一下CNN在图像分割中的发展脉络(主要是R-CNN及其改进方法),看到一篇不错的英文博文《A Brief History of CNNs in Image Segmentation: From R-CNN to Mask R-CNN》,特此翻译过来,供自己和大家参考,若有侵权,还请告知。

另外还有一类基于FCN(Fully Convolutional Network)的语义分割方法,大家可以参考十分钟看懂图像语义分割技术 | 雷锋网,了解此类方法。

在Athelas中可以看到,卷积神经网络(Convolutional Neural Networks,CNNs)应用非常广泛,不仅仅是用于解决分类问题。这篇博文主要介绍如何利用CNNs进行图像实例分割。

自从Alex Krizhevsky, Geoff Hinton, and Ilya Sutskever赢得ImageNet 2012,CNNs开始成为图像分类任务中的黄金准则。事实上,CNNs之后不断提升ImageNet比赛中的图像分类精度,甚至超过了人类的水准。

                       

图1 在ImageNet挑战中,CNNs当前已经达到优于人类的水平,上图中Y轴表示ImageNet的错误率。

虽然分类结果非常惊人,但图像分类任务相对于人类视觉理解任务的复杂性和多样性来说是非常简单的。

                                                     

图2 分类任务中的图像示例,一般图像构图完整且只包含一个物体

图像分类任务中的一张图像一般只关注一个目标,从而预测图像是什么(如图2所示)。但是我们在观察周围世界时要完成非常复杂的事情。

 

图3 现实生活中的场景一般包含各种各样相互重叠的不同目标、背景和动作

现实世界中的复杂场景一般存在相互重叠的目标和不同背景,我们在观察时不仅能够分辨不同的目标,而且可以识别不同目标的边界、差异以及他们之间的(空间)关系。

 

                                   

图4 图像分割任务的目标是对图像中的不同物体进行分类,并识别其边界。(源于:[1703.06870] Mask R-CNN)

CNNs是否可以帮助我们完成如此复杂的任务?也就是说,给定一张复杂的图像,我们是否可以利用CNNs识别图像中的不同目标以及他们的边界呢?Ross Girshick和他的同事近几年的研究表明,答案是当然可以!

本文目标

本博文涵盖目标检测和分割中所用主要技术背后的知识,以及这些技术的演化过程,特别是R-CNN(Regional CNN)(CNNs最初应用于检测和分割问题的方法)及其派生Fast R-CNN和Faster R-CNN,最后我们会讲述Facebook Research最新提出的Mask R-CNN,对这类目标检测问题扩展到像素级图像分割。本博文中引用的论文如下:

  1. R-CNN: [1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation
  2. Fast R-CNN: [1504.08083] Fast R-CNN
  3. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
  4. Mask R-CNN: [1703.06870] Mask R-CNN

 

2014: R-CNN - An Early Application of CNNs to Object Detection

 

                                         

                                          图5 目标检测算法(如R-CNN)识别图像中主要物体的位置和类别

 

受Toronto大学Hinton实验室研究成果的启发,UC Berkeley大学Jitendra Malik教授的团队提出当今看来不可避免的问题:

Krizhevsky等的研究成果如何才能扩展到目标检测?

目标检测任务从图像中找到不同的物体并对其进行分类(如图5所示)。Ross Girshick (a name we’ll see again)、Jeff Donahue和Trevor Darrel团队发现目标检测问题可以借助于Krizhevsky的成果并在PASCAL VOC数据集(ImageNet挑战中的目标检测数据集)中进行测试,文中提到:

这篇论文首次表明了在PASCAL VOC数据集上的目标检测任务中,CNNs能够获得比传统特征(如HOG特征等)好很多的性能。

接下来我们一起理解一下Regions CNNs(R-CNN)工作的架构。

理解R-CNN

R-CNN的目标是从图像中正确识别出主要的物体(采用bounding box进行标注):

  • 输入:图像
  • 输出:图像中每个物体的Bounding Box+标签

如何找出这些bounding box呢?R-CNN采用我们直觉上认为的方式:给出一堆图像可能的box,然后判断这些box是否和物体相关

 

图6 Selective Search方法采用不同尺寸的窗口进行滑动,并查找那些相近纹理、颜色或亮度的相邻像素。(源于:https://www.koen.me/research/pub/uijlings-ijcv2013-draft.pdf)

 

R-CNN采用Selective Search的方法给出region proposals。从高层理解,Selective Search通过不同尺寸的窗口在图像中进行滑动(如图6所示),对于每个尺寸方法采用纹理、颜色或亮度对邻近的像素进行聚合,从而识别物体。

 

图7 获取region proposals集合之后,R-CNN采用AlexNet的修改版本判断这些region proposals是否是有效的region。(源于:[1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation)

获得region proposals集合之后,R-CNN将这些区域变换为标准的方形尺寸,并采用AlexNet的修改版本判断其是否是有效region(如图7所示)。

在CNN的最后一层,R-CNN增加了一个简单的分类器Support Vector Machine(SVM),用于判断区域是否是物体,以及物体的类别。

精化Bounding Box

现在已经找到Box中的物体,接下来是否可以tighten bounding box(进一步调整物体边界,使其更贴近物体周围),从而获取物体的真实范围呢?当然,这也是R-CNN的最后一步,R-CNN对region proposals进行简单的线性回归,从而生成tighten之后的Bounding Box做为最终结果。回归模型的输入和输出如下:

  • 输入:物体在图像中的sub-regions
  • 输出:sub-resions中物体的新Bounding Box坐标

总结一下,R-CNN的步骤如下:

  1. 生成regions proposals集合作为Bounding Box;
  2. 采用预训练的AlexNet+SVM判断Bouding Box对应图像的物体类型;
  3. 对已分类物体的Bounding Box进行线性回归,输出Box对应的tighter bounding boxes。

2015: Fast R-CNN - Speeding up and Simplifying R-CNN

R-CNN效果非常好,但是效率太低了,主要的原因:

  1. 对于每张图像的每个region proposal都需要进行前向的CNN(AlexNet)计算,大概每张图像需要2000次的前向CNN;
  2. 方法中的三个模型是分别训练的——CNN提取图像特征、分类器预测类别、回归模型tighten bounding box的边界,这也导致流程不易训练。

2015年,R-CNN的作者Ross Girshick解决了上述两个问题,并提出了Fast R-CNN的算法,接下来介绍一下Fast R-CNN。

RoI(Region of Interest)Pooling

Ross Girshick发现,每张图像的proposed regions总是朴素重叠的,从而导致重复的CNN前向计算(可能达到2000次)。他的想法非常简单——为什么不每张图像计算一次CNN,为2000个proposed regions找到一种计算共享的方法

 

图8 在RoIPool方法中,采用一次CNN前向计算提取整幅图像的特征图,图像中每个region的特征则从上述特征图中提取。(源于:Stanford’s CS231N slides by Fei Fei Li, Andrei Karpathy, and Justin Johnson)

Fast R-CNN采用RoIPool(Region of Interest Pooling)解决此问题。作为方法的核心,RoIPool分享整幅图像的CNN前向计算给不同的regions。如图8所示,特别注意每个区域的CNN特征如何从CNN的特征图像中选择对应区域特征的。接下来对每个区域的特征进行pool操作(一般采用max pooling)。这样的话我们只需要一次原始图像的CNN前向计算,而非R-CNN中的2000次!

Combine All Models into One Network

 

                              图9 Fast R-CNN将CNN、分类器和边界线性回归融合到一个单独的网络中。(源于:               https://www.slideshare.net/simplyinsimple/detection-52781995)

 

Fast R-CNN第二个想法是将CNN、分类和边界线性回归的训练融合到一个单独的网络中。不像R-CNN中的特征提取(CNN)、分类(SVM)和边界tighten(回归)分别采用三个不同的模型,Fast R-CNN采用一个单独网络实现上述三个步骤。

图9展示了具体融合的过程,Fast R-CNN采用softmax layer取代了SVM分类器作为CNN网络的类别输出层,方法增加了一个平行于softmax layer的linear regression layer作为网络的边界坐标输出层,这样所有的输出需要来自于同一个网络!整个模型的输入和输出如下:

  • 输入:图像以及region proposals
  • 输出:每个区域对应物体的类别以及物体的tighter bounding boxes

2016: Faster R-CNN - Speeding Up Region Proposal

经过上述的改进,Fast R-CNN仍然存在一个瓶颈——region proposer。目标检测方法的第一步就是生成用于测试的潜在bouding box集合或者regions of interest,Fast R-CNN中采用的Selective Search速度非常慢,这也是限制整个算法效率的主要瓶颈。

2015年中,微软的研究团队(Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun)提出一种Faster R-CNN的方法,使得region proposal非常高效。

Faster R-CNN的想法来源于region proposals的特征计算依赖于图像的特征(采用CNN一次性计算整幅图像的特征),那么为何不重用这些相同的CNN特征进行region proposals,从而取代单独的selective search算法呢

                         

图10 Faster R-CNN方法中采用一个单独的CNN进行region proposals和分类。(源于:Towards Real-Time Object Detection with Region Proposal Networks)

实际上,这就是Faster R-CNN方法的核心。图10描述了单独CNN完成region proposals和分类的过程。这样只需要训练一个CNN,region proposals的计算基本可以忽略。文中描述:

我们发现用于检测区域的卷积特征图(类似于Fast R-CNN)同样可以用来生成region proposals(因此使得region proposals变得毫不费力)。

模型的输入和输出如下:

  • 输入:图像(不需要region proposals)
  • 输出:图像中物体的类别及其对应的bounding box坐标

How the Regions are Generated

接下来讨论一下Faster R-CNN如何从CNN特征图中生成region proposals。Faster R-CNN在CNN特征的上层增加了一个全卷积网络,即Region Proposal Network.

 

                    

图11 Region Proposal Network在CNN的特征图上进行滑动窗口操作,对于每个窗口的位置,网络会对每个anchor(候选区域)输出分数和bounding box(共4*k个box坐标,k是anchor的个数)。(源于:Towards Real-Time Object Detection with Region Proposal Networks)


Region Proposal Network在CNN特征图上进行滑动窗口操作,然后每个窗口,输出k个潜在的bounding box和分数,k个boxes如何选择和表达呢?

                                                              

图12 一般行人的bouding box趋向于竖直长方形,据此我们可以构建这样维度的anchor,从而Region Proposal Network的先验知识。(源于:CSE 6367 - Assignments - Assignment 1)

直觉上,我们会认为图像中的物体应该符合一定的大小和长宽比,比如行人的形状更可能是长方形的box。类似地,我们一般也不会关注那些非常窄的boxes。据此,我们构建了k个这样的common aspect ratios,并称作anchor boxes。每个anchor box输出bounding box和对应的位置图像的分数。

考虑这些anchor boxes,Region Proposal Network的输入和输出如下:

  • 输入:CNN特征图
  • 输出:每个anchor对应的bounding box以及分数(表示bounding box中对应图像部分是物体的可能性)

然后,将Region Proposal Network中输出的目标可能bounding box输入到Fast R-CNN,并生成类别和tightened bounding box。

2017: Mask R-CNN - Extending Faster R-CNN for Pixel Level Segmentation

                 

                         图13 图像实例分割的目标是识别场景中像素级的物体。(源于:[1703.06870] Mask R-CNN)

到这里我们已经可以利用CNN特征快速定位图像中不同目标的bounding boxes了,那么接下来是否可以继续延伸一下,提取像素级的目标实例而不是仅仅给出bounding boxes呢?这就是经典的图像分割问题,Kaiming He和他的团队(包括Girshick)在Facebook AI实验室中采用的架构,Mask R-CNN。

类似于Fast R-CNN和Faster R-CNN,Mask R-CNN的潜在创意来源也是很直接的,鉴于Faster R-CNN在目标检测中的效果,我们是否可以将其扩展到像素级的图像分割中呢?

                      

图14 Mask R-CNN在Faster R-CNN的CNN特征提取层的上层增加一个全卷积网络(Fully Convolutional Network,FCN)用于生成mask(分割输出结果)。(源于:[1703.06870] Mask R-CNN)

Maks R-CNN在Faster R-CNN的基础上增加一个分支,用于输出一个二值掩膜(Binary Mask),判断给定像素是否属于物体。上述分支(图14中的白色部分)就是一个置于CNN特征图上层的全卷积神经网络。模型的输入和输出如下:

  • 输入:CNN特征图
  • 输出:指示像素是否属于物体的二值矩阵

但是Mask R-CNN的作者做了少量调整使得整个网络输出期望的结果。

 

RoiAlign - Realigning RoIPool to be More Accurate

 

                  

 

图15 采用RoIAlign取代RoIPool对图像进行遍历,从而使得RoIPool选择区域的特征图与原始图像对应更加精确,主要原因是像素级的分割比bounding box需要更加精确的对齐。(源于:[1703.06870] Mask R-CNN)

直接采用Faster R-CNN的架构执行Mask R-CNN可能导致RoIPool选择区域的特征图与原始图像区域存在少量的偏离。由于图像分割需要像素级的标记,因此这样自然会导致精度下降。

Mask R-CNN采用RoIAlign的方法对RoIPool进行调整使其更精确对齐。

 

                                            图16 如何将region of interest的原始图像和特征图精确对齐?

假设有一幅128*128大小的图像,对应的特征图大小为25*25,如果要将原始图像左上角15*15大小的像素映射到特征图中(如图16所示),如何从特征图中选择像素呢?显然原始图像中每个像素对应特征图中的25/128个像素,要选择原始图像中的15个像素,需要选择15*25/128=2.93个像素。

在RoIPool中,我们会四舍五入选择3个像素,从而会导致微小的偏移。在RoIAlign中,我们要避免这样的近似。取而代之的是采用bilinear interpolation获取精确的对应值,即选择像素2.93,从而能够避免RoIPool导致的偏移。

生成这些mask之后,Mask R-CNN结合Faster R-CNN中生成的分类和bounding box,生成精确的分割结果。

 

图17 Mask R-CNN能够分割图像并对图像中的物体进行分类。(源于:[1703.06870] Mask R-CNN)

 

源码

如果你想自己试验一下这些算法,这里是相关的源码库:

Faster R-CNN

  • Caffe: rbgirshick/py-faster-rcnn
  • PyTorch: longcw/faster_rcnn_pytorch
  • MatLab: ShaoqingRen/faster_rcnn

Mask R-CNN

  • PyTorch: felixgwu/mask_rcnn_pytorch
  • TensorFlow: CharlesShang/FastMaskRCNN

推荐一些相关博文:

【目标检测】RCNN算法详解 - shenxiaolu1984的专栏 - 博客频道 - CSDN.NET
【目标检测】Fast RCNN算法详解【目标检测】Faster RCNN算法详解Mask R-CNN小结 - lancerlian的专栏 - 博客频道 - CSDN.NET

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

CNN图像分割简史:从R-CNN到Mask R-CNN(译) 的相关文章

  • 移植MQTT-C库(附源码)

    Software mqtt org 中mqtt客户端的c库里面有一个叫MQTT C的库 xff0c 就2个实现文件 xff0c 算比较简单的了 xff0c 实现了基本的mqtt客户端功能 xff0c 移植一下试试 我的移植代码放在我的资源里
  • TCP协议的滑动窗口和流量控制算法(转)

    目录 滑动窗口 流量控制 操作系统缓冲区与滑动窗口的关系 窗口关闭 糊涂窗口综合症 拥塞控制 慢启动 拥塞避免算法 拥塞发生 快速恢复 拥塞算法示意图 引入 窗口概念的原因 我们都知道 TCP 是每发送一个数据 xff0c 都要进行一次确认
  • linux应用中的时间处理

    参考下 xff1a Linux下有关时间的函数 xff1a time times clock gettimeofday等 linux time函数 见牛羊的博客 CSDN博客 下面的代码基本涵盖了获取时间和操作计时的一些函数使用 xff1a
  • 从旋转向量到欧拉角的六种计算方法

    利用SolvePNP解出旋转向量 xff0c 旋转向量通过罗德里格斯公式解出旋转矩阵 xff0c 然后通过下面六种公式计算即可 xff0c 欧拉角有十二种 xff0c 六种是相对于自身参考系 xff0c 六种是相对于惯性参考系 xff0c
  • ROS | 服务通信的编程实现

    ROS 服务通信的编程实现 1 创建功能包2 节点编程与服务数据定义2 1 案例说明2 2 服务数据的定义2 3 创建 cpp文件2 4 客户端编程2 5 服务器编程 3 配置与编译3 1 在CMaKeLists txt中添加编译选项3 2
  • HTTP基础验证

    HTTP 内置基础验证 浏览器收到401状态码响应后 xff0c 弹出要求输入信息的对话框 通过验证则显示内容 xff0c 不通过不显示需要验证身份的内容 1 xff1b 手动HTTP基础验证 xff1a header 39 http 1
  • 位域,段域,联合体,结构体操作寄存器

    include lt stdio h gt typedef int Uint16 struct SCICCR BITS bit description Uint16 SCICHAR 3 2 0 Character length contro
  • C++ 网络编程之使用socket + epoll 模拟http 的请求与响应

    为了更好的理解http协议 xff0c 笔者使用了C 43 43 socket模拟了一个http服务器 xff0c 其中的服务器使用了epoll的方式 xff0c 并针对每一个新的连接开启新线程处理 大致分为三个部分 xff0c 具体代码可
  • 【Nova】nova-scheduler过滤称重

    在上一篇 nova scheduler调度过程分析 中 xff0c 对过滤称重的过程一笔带过了 xff0c 这篇着重介绍一下 首先 xff0c 我们声明一下host为主机 xff0c node为节点 xff0c 在OpenStack中一个h
  • 1.通过tcp从daytime服务器获取时间

    最近愈发觉得在学习源代码或者看书的时候 xff0c 做下读书笔记 xff0c 不仅能加深印象和理解 xff0c 同时也方便日后进行回顾 xff0c 所以就写下UNP UNIX网络编程 卷1的读书笔记 xff0c 涉及到的代码基本都是原作者提
  • 4.IPv4和IPv6地址长度

    IPv4地址的二进制形式长度为32 xff0c 使用我们常用的点分十进制形式进行表示那么最长长度为15 xff0c 例如 255 255 255 255 所以在posix的 lt netinet in h gt 中定义的IPv4地址字符串形
  • 29.Nginx HTTP之请求行解析函数ngx_http_parse_request_line

    Nginx的HTTP模块中使用ngx http parse request line函数来对读取的请求行进行解析 xff0c HTTP请求行的格式不是很复杂 xff0c 但是要注意HTTP 0 9与1 0 1 1之间的区别 xff1b 另外
  • 4. 事务隔离级别之Read Uncommitted

    前面我们说过 xff0c 要获得最高的事务隔离性 xff0c 可以采取序列化 串行的方式 xff0c 代价是严重影响系统处理事务的吞吐量 就好像数据库是个多核CPU xff0c 事务串行后 xff0c 那么意味着我们总是在使用单核 xff0
  • Vision Transformer学习笔记

    Vison Transformer学习笔记 1 前言2 网络结构 amp 设计原理2 1 Linear Projection of Flattened Patches2 2 Transformer Encoder2 2 1 Layer No
  • 5. 事务隔离级别之Read Committed

    这篇我们学习事务隔离级别Read Committed xff0c 顾名思义 xff0c 就是读已提交 xff0c 一个事务只能看到其他并发的已提交事务所作的修改 很显然 xff0c 该级别可以解决Read Uncommitted中出现的 脏
  • 6. 事务隔离级别之Repeatable Read

    接下来我们学习Mysql默认的事务隔离级别Repeatable Read xff0c 顾名思义 xff0c 可重复读 xff0c 也即在一个事务范围内相同的查询会返回相同的数据 延续上面的栗子 xff1a 1 小明很开心自己考了69分 xf
  • 7.事务隔离级别之Serializable

    最后我们学习一下最高的事务隔离级别Serializable xff0c 顾名思义 xff0c 可串行化的 xff0c 也即并发事务串行执行 很显然 xff0c 该级别可以避免前面讲到的所有问题 xff1a 脏读 不可重复读 和 幻读 代价是
  • 6. 消息发送重试

    当连接失败 xff0c Celery会自动重试发送消息 xff0c 我们可以对重试行为进行设置 xff0c 譬如说多久重试一次 最大重试次数或者干脆不重试 xff01 当然这只是官方文档说的 xff0c 我在Windows上进行测试 xff
  • 1. RabbitMQ安装

    RabbitMQ作为消息队列 xff0c 在分布式系统中具有举足轻重的作用 xff0c 能够方便地解耦各个组件 xff1b OpenStack之所以具有高扩展性 xff0c RabbitMQ功不可没 虽然一直都在用 xff0c 但没有进行过
  • 1. Tornado实现聊天室

    Tornado的异步I O机制使其很适合处理长连接的场景 xff0c 在官方提供的Demo中就有一个简单的聊天室实现 xff0c 大致做法如下 xff1a 1 提供一个全局的消息缓存 2 每次获取新消息时 xff0c 如果缓存中没有新消息出

随机推荐

  • D435i运行VINS-mono以及Kalib标定

    D435i运行VINS mono以及Kalib标定 系统说明 xff1a Ubuntu 18 04 内核版本 xff1a 5 4 0 1 运行VINS mono 参考博客VINS xff08 D435i xff09 测试 问题 xff1a
  • ESP8266/ESP01 Server模式中TCP Client无法接收到数据

    硬件环境 xff1a ESP01 ESP8266 Windows7 xff0c 网络调试助手 xff0c 串口调试助手 先设置ESP8266的服务器模式 AT 43 CIPMUX 61 1 AT 43 CIPSERVER 61 1 8080
  • ROS报错:TF_OLD_DATA ignoring data from the past for frame leftwheel_link

    现象 xff1a rviz 中提示no transform from XX to odom 原因 xff1a lt param name 61 34 use sim time 34 value 61 34 true 34 gt 中use s
  • STM32-寄存器编程-使用寄存器点亮LED

    一 工程文件的建立 1 我们建立一个 工程模板 文件夹 xff0c 在它下面在新建4个文件夹 Listing存放编译器编译适合产生的C 汇编 链接的列表信息Project存放工程Output存放编译产生的调用信息 hex文件 预览信息 封装
  • VC 与VS的区别以及各个版本之间的对应关系

    各个版本之间的对应关系 使用windows平台搞开发时 xff0c 下载第三方库时经常会遇到文件名以VCxx版本号命令 xff0c VC版本如何转换成对应的VS的版本呢 xff0c 这里总结一下vc和vs的关系 Microsoft Visu
  • C/C++永不过时,不服来辩!

    序言 当你需要为你的项目放弃不同部分的时候 xff0c C 43 43 能帮你做到 当你需要不同抽象层次不同的性能要求时 xff0c C 43 43 能帮你做到 如果用别的语言 xff0c 你会发现那个语言只能做某几类的 而C 43 43
  • 标准c++库和stl库,boost库,qt库的总结(一)

    用了很长时间是stdio iostream 等头文件 xff0c 一直有个疑惑 xff0c 也用了很长一段是键的stl标准库中个别的类 xff0c 间接性的知道了boost库 xff0c qt库等一系列的库 昨天在有用到 include l
  • 激光雷达的结构和分类

    在蔚来ET7的发布会上 xff0c 李斌特别指出 xff0c ET7搭载了1550nm的激光雷达 小鹏P5搭载的两颗大疆览沃车规级激光雷达在ROI区域积分时间0 1秒下 xff0c 能等效144线 极狐阿尔法S HI版搭载的华为的车规版激光
  • STM32之串口通信之printf重定向

    当我们在学习一款CPU时 xff0c 最经典的实验莫过于流水灯了 xff0c 掌握流水灯的话就基本等于学会操作I O口了 xff0c 那么在学会I O之后 xff0c 相对于我们来说会把学习串口的操作放在第二位 在程序运行的时候我们可以点亮
  • 网络RTK——主辅站误差改正法(MAC)

    主辅站误差改正法的基本思想是 xff0c 首先 xff0c 将基准网内所有基准站的相位距离转换到公共整周未知数水平 xff0c 即整周模糊度被消除 其次 xff0c 计算各个误差改正项 xff0c 充分考虑误差的色散和非色散特性 xff0c
  • Centos7 thinkphp6 安装 swoole 小皮面板环境

    环境准备 xff1a centos 7 thinkphp6 nginx 小皮面板 本想着根据官方指引https www kancloud cn manual thinkphp6 0 1359700 完成安装 xff0c 结果中间波折挺多 x
  • 关于qt中加载gif图片,cpu占用过高的解决发办法

    1 将gif图拆分成若干张静态png图 xff1b 2 程序启动 xff0c QImage对象list中 xff1b 3 使用定时器或者多线程来控制label setPixmap加载的QImage对象 xff1b 关于gif显示快慢的问题
  • linux下命令行方式的音量控制

    输入命令 xff1a alsamixer xff1b 设置系统音量 xff0c 这个百分比会有一定的误差存在 amixer set Speaker 100 设置系统麦克风 amixer set Mic 100 c 43 43 代码可以执行运
  • Ubuntu检测ip有效性 且 修改系统ip

    正则表达式实现检测IP地址是否有效 bool UntilTool CheckIPAddrIsVaild string str regex check ip 34 25 0 5 2 0 4 0 9 1 0 9 0 9 1 9 0 9 1 9
  • clion同一个项目创建多个可执行文件

    简述需求 xff1a 需要写多个可执行文件 xff0c 但是文件一些工具类等都是通用的 xff0c 比较麻烦的就是创建多个项目 xff0c 下来让你一个项目中生成多个可执行文件 xff0c 用到那个编译那个就可以了 默认创建好项目后 xff
  • Visual Studio Code (vscode) 配置C、C++环境/编写运行C、C++(Windows)【真正的小白版】

    写在前面的前面 xff1a 这篇文章vscode和cpp插件版本有点老了 xff0c 仅供大家参考 xff0c 最新的和最详细的更新见我的另一篇文章 xff1a https blog csdn net bat67 article detai
  • linux服务端下的c++ udp socket demo

    linux服务端 udp socket demo 如下 xff1a 创建接受数据的socket int iSock 61 socket PF INET SOCK DGRAM 0 printf 34 socket ss d n 34 iSoc
  • ROS个别命令的使用 ros ros2

    ros1 录包 rosbag record a O filename bag 解释 xff1a a是把所有的包都进行录制 xff0c O表示后面需要跟输出的文件名字 xff0c o的话系统会自己添加录制日期为文件名上 xff1b rosba
  • 浅析 自动驾驶、遥控驾驶、平行驾驶区别

    以下内容仅为个人粗浅理解 xff0c 欢迎大家留言指正 图片内容来源于互联网 xff0c 图片权利归图片作者所有 xff0c 本文仅引用 自动驾驶 xff1a 重点在车端 xff0c 自动驾驶相关资源部署在车端 xff0c 或大部分算力等都
  • CNN图像分割简史:从R-CNN到Mask R-CNN(译)

    一直想总结一下CNN在图像分割中的发展脉络 xff08 主要是R CNN及其改进方法 xff09 xff0c 看到一篇不错的英文博文 A Brief History of CNNs in Image Segmentation From R