faster-rcnn原理及相应概念解释

R-CNN --> FAST-RCNN --> FASTER-RCNN

R-CNN:

(1)输入测试图像;

(2)利用selective search 算法在图像中从上到下提取2000个左右的Region Proposal;

(3)将每个Region Proposal缩放(warp)成227*227的大小并输入到CNN,将CNN的fc7层的输出作为特征;

(4)将每个Region Proposal提取的CNN特征输入到SVM进行分类;

(5)对于SVM分好类的Region Proposal做边框回归,用Bounding box回归值校正原来的建议窗口,生成预测窗口坐标.

缺陷:

(1)     训练分为多个阶段,步骤繁琐:微调网络+训练SVM+训练边框回归器;

(2)     训练耗时,占用磁盘空间大;5000张图像产生几百G的特征文件;

(3)     速度慢:使用GPU,VGG16模型处理一张图像需要47s;

(4)     测试速度慢:每个候选区域需要运行整个前向CNN计算;

(5)     SVM和回归是事后操作,在SVM和回归过程中CNN特征没有被学习更新.

FAST-RCNN:

(1)输入测试图像;

(2)利用selective search 算法在图像中从上到下提取2000个左右的建议窗口(Region Proposal);

(3)将整张图片输入CNN,进行特征提取;

(4)把建议窗口映射到CNN的最后一层卷积feature map上;

(5)通过RoI pooling层使每个建议窗口生成固定尺寸的feature map;

(6)利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练.

相比R-CNN,主要两处不同:

(1)最后一层卷积层后加了一个ROI pooling layer;

(2)损失函数使用了多任务损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练

改进:

(1)     测试时速度慢:R-CNN把一张图像分解成大量的建议框,每个建议框拉伸形成的图像都会单独通过CNN提取特征.实际上这些建议框之间大量重叠,特征值之间完全可以共享,造成了运算能力的浪费.

FAST-RCNN将整张图像归一化后直接送入CNN,在最后的卷积层输出的feature map上,加入建议框信息,使得在此之前的CNN运算得以共享.

(2)     训练时速度慢:R-CNN在训练时,是在采用SVM分类之前,把通过CNN提取的特征存储在硬盘上.这种方法造成了训练性能低下,因为在硬盘上大量的读写数据会造成训练速度缓慢.

FAST-RCNN在训练时,只需要将一张图像送入网络,每张图像一次性地提取CNN特征和建议区域,训练数据在GPU内存里直接进Loss层,这样候选区域的前几层特征不需要再重复计算且不再需要把大量数据存储在硬盘上.

(3)     训练所需空间大:R-CNN中独立的SVM分类器和回归器需要大量特征作为训练样本,需要大量的硬盘空间.FAST-RCNN把类别判断和位置回归统一用深度网络实现,不再需要额外存储.

FASTER -RCNN:

(1)输入测试图像;

(2)将整张图片输入CNN,进行特征提取;

(3)用RPN生成建议窗口(proposals),每张图片生成300个建议窗口;

(4)把建议窗口映射到CNN的最后一层卷积feature map上;

(5)通过RoI pooling层使每个RoI生成固定尺寸的feature map;

(6)利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练.

相比FASTER-RCNN,主要两处不同:

(1)使用RPN(Region Proposal Network)代替原来的Selective Search方法产生建议窗口;

(2)产生建议窗口的CNN和目标检测的CNN共享

改进:

(1)     如何高效快速产生建议框?

FASTER-RCNN创造性地采用卷积网络自行产生建议框,并且和目标检测网络共享卷积网络,使得建议框数目从原有的约2000个减少为300个,且建议框的质量也有本质的提高.

概念解释:

1、常用的Region Proposal有:

-Selective Search

-Edge Boxes

2、softmax-loss
softmax-loss 层和 softmax 层计算大致是相同的. softmax 是一个分类器,计算的是类别的概率(Likelihood),是 Logistic Regression 的一种推广. Logistic Regression 只能用于二分类,
而 softmax 可以用于多分类.
softmax 与 softmax-loss 的区别:
softmax 计算公式:

关于两者的区别更加具体的介绍,可参考: softmax vs. softmax-loss
用户可能最终目的就是得到各个类别的概率似然值,这个时候就只需要一个 Softmax 层,而不一定要进行 softmax-Loss 操作;或者是用户有通过其他什么方式已经得到了某种概率似然值,然后要做最大似然估计,此时则只需要后面的 softmax-Loss 而不需要前面的 Softmax操作.因此提供两个不同的 Layer 结构比只提供一个合在一起的 Softmax-Loss Layer 要灵活许多.不管是 softmax layer 还是 softmax-loss layer,都是没有参数的,只是层类型不同而已
softmax-loss layer:输出 loss 值
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip1"
bottom: "label"
top: "loss"
}
softmax layer: 输出似然值
layers {
bottom: "cls3_fc"
top: "prob"
name: "prob"
type: “Softmax"
}

3、Selective Search

这个策略其实是借助了层次聚类的思想(可以搜索了解一下"层次聚类算法"),将层次聚类的思想应用到区域的合并上面;

总体思路:

l  假设现在图像上有n个预分割的区域(Efficient Graph-Based Image Segmentation),表示为R={R1, R2, ..., Rn},

l  计算每个region与它相邻region(注意是相邻的区域)的相似度,这样会得到一个n*n的相似度矩阵(同一个区域之间和一个区域与不相邻区域之间的相似度可设为NaN),从矩阵中找出最大相似度值对应的两个区域,将这两个区域合二为一,这时候图像上还剩下n-1个区域;

l  重复上面的过程(只需要计算新的区域与它相邻区域的新相似度,其他的不用重复计算),重复一次,区域的总数目就少1,知道最后所有的区域都合并称为了同一个区域(即此过程进行了n-1次,区域总数目最后变成了1).算法的流程图如下图所示:

4、SPP-NET

SSP-Net:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

先看一下R-CNN为什么检测速度这么慢,一张图都需要47s!仔细看下R-CNN框架发现,对图像提完Region Proposal(2000个左右)之后将每个Proposal当成一张图像进行后续处理(CNN提特征+SVM分类),实际上对一张图像进行了2000次提特征和分类的过程!这2000个Region Proposal不都是图像的一部分吗,那么我们完全可以对图像提一次卷积层特征,然后只需要将Region Proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个Region Proposal的卷积层特征输入到全连接层做后续操作.(对于CNN来说,大部分运算都耗在卷积操作上,这样做可以节省大量时间).

现在的问题是每个Region Proposal的尺度不一样,直接这样输入全连接层肯定是不行的,因为全连接层输入必须是固定的长度.SPP-NET恰好可以解决这个问题.

由于传统的CNN限制了输入必须固定大小(比如AlexNet是224x224),所以在实际使用中往往需要对原图片进行crop或者warp的操作:
   - crop:截取原图片的一个固定大小的patch
   - warp:将原图片的ROI缩放到一个固定大小的patch

无论是crop还是warp,都无法保证在不失真的情况下将图片传入到CNN当中:
   - crop:物体可能会产生截断,尤其是长宽比大的图片.
   - warp:物体被拉伸,失去“原形”,尤其是长宽比大的图片

SPP为的就是解决上述的问题,做到的效果为:不管输入的图片是什么尺度,都能够正确的传入网络.
   具体思路为:CNN的卷积层是可以处理任意尺度的输入的,只是在全连接层处有限制尺度——换句话说,如果找到一个方法,在全连接层之前将其输入限制到等长,那么就解决了这个问题.

具体方案如下图所示:

如果原图输入是224x224,对于conv5出来后的输出,是13x13x256的,可以理解成有256个这样的filter,每个filter对应一张13x13的activation map.如果像上图那样将activation map pooling成4x4 2x2 1x1三张子图,做max pooling后,出来的特征就是固定长度的(16+4+1)x256那么多的维度了.如果原图的输入不是224x224,出来的特征依然是(16+4+1)x256;直觉地说,可以理解成将原来固定大小为(3x3)窗口的pool5改成了自适应窗口大小,窗口的大小和activation map成比例,保证了经过pooling后出来的feature的长度是一致的.

5、Bounding box regression

R-CNN中的bounding box回归

下面先介绍R-CNN和Fast R-CNN中所用到的边框回归方法.

(1)   什么是IOU

(2)   为什么要做Bounding-box regression? 
 
如上图所示,绿色的框为飞机的Ground Truth,红色的框是提取的Region Proposal.那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5),那么这张图相当于没有正确的检测出飞机.如果我们能对红色的框进行微调,使得经过微调后的窗口跟Ground Truth更接近,这样岂不是定位会更准确.确实,Bounding-box regression 就是用来微调这个窗口的.

(3)   回归/微调的对象是什么?

(4)   Bounding-box regression(边框回归) 
那么经过何种变换才能从图11中的窗口P变为窗口呢?比较简单的思路就是: 
 


注意:只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不work(当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理).这个也是G-CNN: an Iterative Grid Based Object Detector多次迭代实现目标准确定位的关键. 
线性回归就是给定输入的特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y(Ground Truth)非常接近.即.那么Bounding-box中我们的输入以及输出分别是什么呢?

6、Region Proposal Network

RPN的实现方式:在conv5-3的卷积feature map上用一个n*n的滑窗(论文中作者选用了n=3,即3*3的滑窗)生成一个长度为256(对应于ZF网络)或512(对应于VGG网络)维长度的全连接特征.然后在这个256维或512维的特征后产生两个分支的全连接层:

(1)reg-layer,用于预测proposal的中心锚点对应的proposal的坐标x,y和宽高w,h;

(2)cls-layer,用于判定该proposal是前景还是背景.sliding window的处理方式保证reg-layer和cls-layer关联了conv5-3的全部特征空间.事实上,作者用全连接层实现方式介绍RPN层实现容易帮助我们理解这一过程,但在实现时作者选用了卷积层实现全连接层的功能.

(3)个人理解:全连接层本来就是特殊的卷积层,如果产生256或512维的fc特征,事实上可以用Num_out=256或512, kernel_size=3*3, stride=1的卷积层实现conv5-3到第一个全连接特征的映射.然后再用两个Num_out分别为2*9=18和4*9=36,kernel_size=1*1,stride=1的卷积层实现上一层特征到两个分支cls层和reg层的特征映射.

(4)注意:这里2*9中的2指cls层的分类结果包括前后背景两类,4*9的4表示一个Proposal的中心点坐标x,y和宽高w,h四个参数.采用卷积的方式实现全连接处理并不会减少参数的数量,但是使得输入图像的尺寸可以更加灵活.在RPN网络中,我们需要重点理解其中的anchors概念,Loss fucntions计算方式和RPN层训练数据生成的具体细节.

Anchors:字面上可以理解为锚点,位于之前提到的n*n的sliding window的中心处.对于一个sliding window,我们可以同时预测多个proposal,假定有k个.k个proposal即k个reference boxes,每一个reference box又可以用一个scale,一个aspect_ratio和sliding window中的锚点唯一确定.所以,我们在后面说一个anchor,你就理解成一个anchor box 或一个reference box.作者在论文中定义k=9,即3种scales和3种aspect_ratio确定出当前sliding window位置处对应的9个reference boxes, 4*k个reg-layer的输出和2*k个cls-layer的score输出.对于一幅W*H的feature map,对应W*H*k个锚点.所有的锚点都具有尺度不变性.

Loss functions:

在计算Loss值之前,作者设置了anchors的标定方法.正样本标定规则:

1)   如果Anchor对应的reference box与ground truth的IoU值最大,标记为正样本;

2)   如果Anchor对应的reference box与ground truth的IoU>0.7,标记为正样本.事实上,采用第2个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的reference box与groud truth的IoU不大于0.7,可以采用第一种规则生成.

3)   负样本标定规则:如果Anchor对应的reference box与ground truth的IoU<0.3,标记为负样本.

4)   剩下的既不是正样本也不是负样本,不用于最终训练.

5)   训练RPN的Loss是有classification loss (即softmax loss)和regression loss (即L1 loss)按一定比重组成的.

计算softmax loss需要的是anchors对应的groundtruth标定结果和预测结果,计算regression loss需要三组信息:

i.     预测框,即RPN网络预测出的proposal的中心位置坐标x,y和宽高w,h;

ii.      锚点reference box:

之前的9个锚点对应9个不同scale和aspect_ratio的reference boxes,每一个reference boxes都有一个中心点位置坐标x_a,y_a和宽高w_a,h_a;

iii.  ground truth:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h*.因此计算regression loss和总Loss方式如下:

RPN训练设置:

(1)在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1.

(2)如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然.

(3)训练RPN时,与VGG共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数;剩下没有的层参数用标准差=0.01的高斯分布初始化.

7、RoI Pooling

ROI pooling layer实际上是SPP-NET的一个精简版,SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采样到一个7x7的特征图.对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个7*7*512维度的特征向量作为全连接层的输入.

RoI Pooling就是实现从原图区域映射到conv5区域最后pooling到固定大小的功能.

8、smooth L1 Loss

为了处理不可导的惩罚,Faster RCNN提出来的计算距离loss的smooth_L1_Loss.smooth L1近似理解见http://pages.cs.wisc.edu/~gfung/GeneralL1/L1_approx_bounds.pdf

标签: caffe, faster-rcnn
好文要顶 关注我 收藏该文

白鹭倾城
关注 - 1
粉丝 - 49

+加关注

11
0

« 上一篇: caffe框架下目标检测——faster-rcnn实战篇操作
» 下一篇: python的N个小功能(图片预处理:打开图片,滤波器,增强,灰度图转换,去噪,二值化,切割,保存)

   </div><div class="postDesc">posted @ <span id="post-date">2017-03-16 17:59</span> <a href="https://www.cnblogs.com/dudumiaomiao/">白鹭倾城</a> 阅读(<span id="post_view_count">61441</span>) 评论(<span id="post_comment_count">4</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=6560841" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(6560841);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=242827,cb_entryId=6560841,cb_blogApp=currentBlogApp,cb_blogUserGuid='df08107f-ee4e-e511-b908-9dcfd8948a71',cb_entryCreatedDate='2017/3/16 17:59:00';loadViewCount(cb_entryId);var cb_postType=1;</script>

发表评论
    <div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3863832" class="layer">#1楼</a><a name="3863832" id="comment_anchor_3863832"></a>  <span class="comment_date">2017-12-12 14:57</span> | <a id="a_comment_author_3863832" href="https://www.cnblogs.com/chestnutJack/" target="_blank">chestnutJack</a> <a href="http://msg.cnblogs.com/send/chestnutJack" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3863832" class="blog_comment_body">学习了,收!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3863832,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3863832,'Bury',this)">反对(0)</a></div><span id="comment_3863832_avatar" style="display:none;">http://pic.cnblogs.com/face/1268266/20171030112710.png</span></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3889781" class="layer">#2楼</a><a name="3889781" id="comment_anchor_3889781"></a>  <span class="comment_date">2018-01-16 09:45</span> | <a id="a_comment_author_3889781" href="http://home.cnblogs.com/u/1319208/" target="_blank">xiaohengongzi</a> <a href="http://msg.cnblogs.com/send/xiaohengongzi" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3889781" class="blog_comment_body">你好,Faster RCNN的region proposal如何映射到原图中去 我想在原图中画那个矩形框的。如果看的信息的话,加我QQ 1067808263 麻烦了</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3889781,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3889781,'Bury',this)">反对(0)</a></div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3896815" class="layer">#3楼</a><a name="3896815" id="comment_anchor_3896815"></a>[<span class="louzhu">楼主</span>]  <span class="comment_date">2018-01-24 22:24</span> | <a id="a_comment_author_3896815" href="https://www.cnblogs.com/dudumiaomiao/" target="_blank">白鹭倾城</a> <a href="http://msg.cnblogs.com/send/%E7%99%BD%E9%B9%AD%E5%80%BE%E5%9F%8E" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3896815" class="blog_comment_body"><a href="#3889781" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,3889781);">@</a>

xiaohengongzi
在http://www.cnblogs.com/dudumiaomiao/p/6556111.html有写如何得到矩形框

支持(0) 反对(0)
 <div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3901180" class="layer">#4楼</a><a name="3901180" id="comment_anchor_3901180"></a><span id="comment-maxId" style="display:none;">3901180</span><span id="comment-maxDate" style="display:none;">2018/1/31 15:49:28</span>  <span class="comment_date">2018-01-31 15:49</span> | <a id="a_comment_author_3901180" href="http://home.cnblogs.com/u/1319208/" target="_blank">xiaohengongzi</a> <a href="http://msg.cnblogs.com/send/xiaohengongzi" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3901180" class="blog_comment_body">@白鹭倾城  谢谢楼主!!!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3901180,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3901180,'Bury',this)">反对(0)</a></div></div></div>
<div id="comments_pager_bottom"></div></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
刷新评论 刷新页面 返回顶部
注册用户登录后才能发表评论,请 登录 或 注册, 访问网站首页。
【推荐】超50万VC++源码: 大型组态工控、电力仿真CAD与GIS源码库!
【活动】申请成为华为云云享专家 尊享9大权益
【工具】SpreadJS纯前端表格控件,可嵌入应用开发的在线Excel
【腾讯云】拼团福利,AMD云服务器8元/月
相关博文:
· 从R-CNN到FAST-RCNN再到Faster R-CNN
· 11月深度学习班第5课图像物体检测:rcnn/fast-rcnn/faster-rcnn
· 文献阅读:基于深度学习的目标检测研究进展[2016,技术文章]
· paper 111:图像分类物体目标检测 from RCNN to YOLO
· Object Detection︱RCNN、faster-RCNN框架的浅读与延伸内容笔记
</div>

Faster-R-CNN算法理解相关推荐

  1. Faster R CNN

    Faster R CNN 3 FASTER R-CNN 我们的Faster R CNN 由两个模块组成,第一个模块是 proposes regions 的全卷积网络,第二个是使用 proposed r ...

  2. 基于CNN算法自定义模型的动物识别项目1

    基于CNN算法自定义模型的动物识别项目1 资源文件 一.数据集介绍 二.开发步骤 1.引入库 2.定义模型 3.定义优化器 4.训练数据增强 5.测试数据归一化 6.数据生成 7.查看类别定义 8.训 ...

  3. R语言学习以及我对R语言的理解。

    关于对R语言的理解: 这里我讲一下自己对于R语言的理念,我不想重复那些已经被转播烂了的概念解释.发展历史.及其功能简介. R语言是统计学家开发的,出生之初就决定了它的使命是统计计算和数据可视化,这算是 ...

  4. FP-Growth算法理解

    FP-Growth算法理解 基本概念 FP-Growth 全称: Frequent Pattern Growth--频繁模式增长 在整个算法执行过程中,只需要遍历数据集2次,就可完成频繁模式的发现 F ...

  5. 强化学习算法DQN:算法简介、创新点:回放机制target-network、伪代码、算法理解、代码实现、tensorboard展示网络结构

    文章目录 DQN简介 DQN目标 Q-learning与DQN Loss Function 创新点:回放机制&target-network 算法伪代码 算法理解 代码实现 tensorboar ...

  6. 《Towards Viewpoint Invariant 3D Human Pose Estimation》--深度图领域人体姿态估计的CNN算法

    <Towards Viewpoint Invariant 3D Human Pose Estimation>–深度图领域人体姿态估计的CNN算法 这篇文章是ECCV 2016的一篇3D人体 ...

  7. 凸包算法理解——基于MATLAB代码

    个人有个习惯:学习一个算法,要有代码能单步逐行理解. 正好这两天研究了一下凸包算法.留个记录文档吧. 代码如下,有详细备注. % 凸包算法理解   clear all;close all;clc; % ...

  8. 密码学系列——MD5算法理解记录

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 密码学系列--MD5算法理解记录 前言 MD5算法流程 总结 前言 主要是为了快速回忆之前工作的一些记录,不至于完全忘记.因此此处不会 ...

  9. faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data)

    转载自:faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data) - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.n ...

  10. DL之CNN:利用CNN算法实现对句子分类+进行情感分析(预测句子情感)

    DL之CNN:利用CNN算法实现对句子分类+进行情感分析(预测句子情感) 目录 CNN算法设计思路 代码实现 CNN算法设计思路 b 代码实现 后期更新--

最新文章

  1. Pytorch两种模型保存方式
  2. socket中select针对阻塞I/O复用注意的问题
  3. /usr/lib/sudo/sudoers.so must be only be writable by owner
  4. Ubuntu配置安装NFS服务器
  5. 内部存储_Mongodb存储特性与内部原理
  6. LVS-NAT工作模式的实现
  7. 将tomcat添加到系统服务
  8. python入门教材论坛_Python初学者(零基础学习Python、Python入门)书籍、视频、资料、社区推荐...
  9. html文件变成巨大,巨大的JavaScript HTML5 blob(从大ArrayBuffers)在客户端构建一个巨大的文件...
  10. 3D引擎多线程:资源异步加载
  11. FreeSWITCH 初步
  12. 如何将.sql文件导入数据库
  13. 数据结构实验:数制转换
  14. 关闭华硕笔记本触摸屏
  15. Java动态数组ArrayList
  16. 综合项目之闪讯破解(三)之 如何用C++实现PPPOE拨号
  17. JSjavascript获取B站bilibili哔哩哔哩分P播放列表并以excel文件保存本地
  18. mysql与pg的主键索引说明
  19. 一文读懂麦克风典型应用电路
  20. esp32 + DHT11温湿度传感器+阿里云物联网平台实时数据显示 实现设备上云

热门文章

  1. 深度学习(二):用CNTK在Python下实现一个简单的FeedForward网络
  2. 2022年9月5日-9月11日(热更新视频+rhi模块源码抄写+大象无形调试,本周40小时,合计1562小时,剩余8438小时。)
  3. vue 里怎么使用 echarts 实现地图自动轮播功能、自定义 tooltip 悬浮位置提示、自定义 label 标签位置样式?
  4. ASO100:2016移动互联网发展白皮书
  5. 【数据分析】matplotlib绘制条形图,散点图,直方图及总结 No.2
  6. 华为鸿蒙系统界面_谷歌懵圈!华为鸿蒙系统界面首次曝光,网友纷纷表示支持...
  7. 2023真无线蓝牙耳机怎么选?高性价比蓝牙耳机品牌有哪些?值得入手的蓝牙耳机推荐!
  8. 09年相当有才的100句话
  9. 简介PCBA包工包料
  10. 机器学习笔记--GMM模型