资源算法SSD_for_Tensorflow

SSD_for_Tensorflow

2020-01-03 | |  43 |   0 |   0

SSD_for_Tensorflow

Single Shot MultiBox Detector目标检测算法基于tensorflow的实现
论文在这里

网上也有不少基于tensorflow实现ssd的源码,不过大多码得太复杂。
我看了几套,然后就有一种强烈的冲动再码一套尽可能简单直接的源码,一方面可以更好地理解SSD的内部原理,另一方面也可以给各位初学者有个简单入门的源码参考。

代码结构:
ssd300.py - ssd的核心代码封装,实现300 * 300的图片格式。
main.py - ssd300的使用用例,包括训练、检测的调用示例。训练时使用voc2012数据集,数据可以从这里下载,解压到train_datasetsvoc2012目录下

因为要简洁,就只有这2个文件。

与原论文不一致的地方:
1,box的位置信息论文描述为 [center_X, center_Y, width, height], 为了更好兼容和理解,这套源码统一改为[top_X, top_Y, width, height]


2,论文中default box的width=scale*sqrt(aspect_ratio)、height=scale/sqrt(aspect_ratio) 是错误的,
改为width=sqrt(scale * aspect_ratio)、height=sqrt(scale/aspect_ratio),有兴趣的朋友可以反推一下。

3,按照论文中描述长宽比ratio = 1时,scale=sqrt(scale0 * scale1),即值为sqrt(1.0 * 2.0)=1.414,与scale4=1.5接近,不利于区分default box,因此直接修改为(scale0+scale4)/2=(1.0+1.5)/2=1.25,即取scale0和scale4中间值。

4,论文中default_box_scale由公式s_k=s_min+(s_max-s_min) * (k-1)/(m-1)生成,源码改为np.linspace生成等差数组,效果一致

5,box scale 由[ 0.2 , 0.9 ]改为[ 0.1 , 0.9 ],因为最小box面积0.2不利于识别面积小的物体,所以改为0.1



调用简单示例
1,检测
    ssd_model = ssd300.SSD300(tf_sess=sess, isTraining=False)
    f_class,f_location = ssd_model.run(input_img,None)
2,训练
    ssd_model = ssd300.SSD300(tf_sess=sess, isTraining=True)
    loss_all,loss_location,loss_class = ssd_model.run(train_data, actual_data)

【整体框架源码已完成,可以参考学习。还没完成训练,可能还存在一些问题,如果发现有问题,请告诉我 : jasonli8848@qq.com

【注】
1,【经实验top_x,top_y并不适合卷积,会降低精度,应改为center_x,center_y】;
2,【源码中vgg基础网络并不完善,最好改为ResNet + Inception2】;
3,【default box 应根据具体业务设置,以免造成资源浪费以及影响精度】;





上一篇:ssd_tensorflow_traffic_sign_detection

下一篇:tensorflow-deeplab-v3

用户评价
全部评价

热门资源

  • Keras-ResNeXt

    Keras ResNeXt Implementation of ResNeXt models...

  • seetafaceJNI

    项目介绍 基于中科院seetaface2进行封装的JAVA...

  • spark-corenlp

    This package wraps Stanford CoreNLP annotators ...

  • capsnet-with-caps...

    CapsNet with capsule-wise convolution Project ...

  • inferno-boilerplate

    This is a very basic boilerplate example for pe...