再读ssd

       如转载请注明来自abrams的博客:http://blog.csdn.NET/abrams90       

        目前有两种常见的图片目标检测方式,一种是基于滑动窗的,一种是基于目标区域提取与分类的。在深度学习时代之前,Deformable Part Model(DPM)与Selective Search是效果最好的方法,他们的效果差距不大。R-CNN的提出的区域提取与分类的的思路结合卷积神经网络强大的能力,使得R-CNN成为了最流行也是效果最好的方法。

        R-CNN的方法有很多的改进。最初R-CNN的最大问题是时效性太差,SS提取的大量区域通用CNN分别提取特征并进行分类,使得计算量特别的大。这时提出的SPPNET通过与spatial pyramid pooling层共用featureMap,巧妙的解决了不同大小的特征区域放到同一个分类网络中进行分类的问题,这样也同时解决了每个区域都要提取一次特征的问题,提升了分类的效率。Fast Rcnn对SPPNET进行了扩展,使用了RoiPooling层做特征提取,并且可以初步端到端的finetune所有层来优化目标分类与区域回归的损失函数。其中ROIPooling可以说是spatial pyramid pooling思想的简化版,而区域回归的思想来自MultiBox算法中。

        第二种改进思路是用深度神经网络来改进区域提取的效果。MultiBox算法提出了直接用一个网络分支进行区域提取,替代之前使用传统特征的SS算法。这种思路很值得借鉴,但是分别训练两个相关的网络却不是一件容易的事。Faster R-CNN用RPN替代了SS用于区域提取,并且通过共享卷积层整合了两个网络,并且提出一种轮流优化两个任务的训练模式。这样rpn使用的中层的特征,最终的分类的计算量也低了下来。SSD的思路跟rpn的思路类似,也使用了一系列固定的默认框做区域提取,类似Faster R-CNN中锚点的思路。SSD没有使用RoiPooling进行区域分类特征提取,而是在区域提取的同时对每个区区域进行了分类,得到一个区域每个类别的得分。因此,SSD避免了RPN与Fast R-CNN结合的问题,更容易进行训练,速度更快,并且更容易与其它任务结合。

        目标检测的另外一种思路是不进行区域提取直接预测区域与分类的得分,这与SSD的思路很一致。OverFeat提出了一种直接在已知目标类型后对区域进行预测的方法。YOLO使用整个顶层的特征图来预测区域与类别,这里区域的预测是所有类别共享的。与YOLO相比,SSD使用了不同比例与大小的默认框,在不同层的特征上。如果自在顶层使用一个默认框的话SSD的结构就跟OverFeat的结构类似了。如果使用整个顶层特征,使用fc而不是卷积层作为分类结构,并且不考虑不同长宽比的话,就跟YOLO的结构相似了。

        SSD可以说是集各家所长的一种目标检测算法,结合了目标检测领域YOLO的暴力回归思路与RCNN的RPN,达到了速度与准确率的齐头并进。在论文中,作者做了展示,使用500*500的样本甚至超过了标准FASTER-RCNN最短边600的准确率,却达到了23fps的速度。这对工程界来说,不得不说是一个很大的突破,甚至在cpu模式下也可以勉强使用深度学习做目标检测了。这里引用文中的表格展示下它的性能,可以看出来SSD300达到了性能与准确率极佳的一种平衡:

方法

mAP

FPS

Faster R-CNN VGG16

73.2

7

Faster R-CNN ZF

62.1

17

YOLO

63.4

45

FAST YOLO

52.7

155

SSD300

72.1

58

SSD500

75.1

23

        作者在论文中总结SSD的创新点有如下几个:

1、  提出了SSD算发,比YOLO的速度更快,比FasterR-CNN准确率更高。

2、  在特征图上使用全卷积来预测目标的得分与目标区域的偏移量。

3、  为了提高检测分类的准确率,使用不同尺度的的特征图来预测不同长宽比与尺度的目标。

4、  这样的设计是的训练可以端到端的进行,并且即使使用低分辨率的样本作为输入准确率也较高。达到了准确与与速度的平衡。

   尽管每个创新点看起来都不想RPN这样石破天惊,但是几点结合起来的效果却不容小觑。

   作者在文中对不同的改进点的作用有个对比测试:

  

 

             SSD300

More data augmentation

 

Use conv4_3

 

Include{1/2,2}box

 

Include{1/3,3}box

 

 

Use atrous

 

VOC2007 map

65.4

68.1

69.2

71.2

71.4

72.1

        可以很容易的看出来,作者使用的数据扩展方法对map的提升是最大的,达到了7个点,从训练代码中也可以看出来,作者的数据层还是比较复杂的。其次使用中层的特征影响第二大,如果特征越高层,一些小目标在特征图上可能都表现不出来了,所以中层的特征对小目标的影响比较明显。不同尺度的目标框也有差不多两个点的影响值。这里对Atrous算法还不知道是啥,就先不说了。

        最后,文中也介绍了,SSD有两个小缺点。一个是对目标大小比较敏感,特别是对小目标的检测比对大目标的检测要差不少。另外,对相似类别的分类能力较弱。我想结合SSD的网络结构特点,这两个缺点也很好理解。对于将深度学习应用与目标检测产品中的需求来说SSD的出现无疑是个福音。

### 固态硬盘(SSD)介绍 固态硬盘(Solid State Drive,简称 SSD),是一种利用 NAND 型闪存作为存储介质的设备。与传统的机械硬盘不同,SSD 是由固态电子元件构成,内部没有任何可动部件[^3]。 #### 工作原理 当计算机向 SSD 发送指令时,控制器会解析这些命令并将它们转换成可以被 NAND 闪存理解的操作。NAND 闪存单元通过改变电压状态来表示二进制数据位——即 0 或者 1。由于不存在物理寻道过程,因此访问速度极快,能够显著减少系统的响应时间和文件加载时间。 对于写入操作而言,因为 NAND 闪存在每次编程前都需要先擦除已有的内容,所以实际执行的是“擦-写”的循环动作。为了延长使用寿命并保持性能稳定,现代 SSD 都采用了诸如磨损均衡算法这样的机制,在多个区块之间均匀分配写入次数,从而避免某些区域过早失效[^2]。 另外值得注意的一点是,尽管 SSD 的读/写速度快于 HDD,但在处理大量连续的数据流方面仍然可能存在瓶颈;不过这通常不会影响到日常使用体验,尤其是在搭配足够的缓存和支持 TRIM 功能的情况下。 ```python # Python模拟简单的SSD读写流程(简化版) class SimpleSSDBlock: def __init__(self): self.data = None def write(self, data): # 模拟擦除现有数据再写新数据的过程 print("Erasing old content...") self.erase() print(f"Writing new data: {data}") self.data = data def read(self): if not self.data is None: return f"Reading data: {self.data}" else: return "No valid data found." def main(): block = SimpleSSDBlock() # 写入一些测试数据 block.write('Test Data') # 尝试读回刚才写入的内容 result = block.read() print(result) if __name__ == "__main__": main() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值