深度学习目标检测 caffe下 yolo-v1 yolo-v2 vgg16-ssd squeezenet-ssd mobilenet-v1-ssd mobilenet-v12-ssd

1、caffe下yolo系列的实现

1.1 caffe-yolo-v1

我的github代码 点击打开链接

参考代码 点击打开链接

yolo-v1 darknet主页 点击打开链接

上面的caffe版本较老。对新版的cudnn支持不好,可能编译出错,需要修改 cudnn.hpp头文件在次进行编译,

修改后的cudnn.hpp文件,可在我的github主页找到。

步骤:

0、voc数据集转换成 caffe下数据库格式文件,上述github也有记录;

1、可以根据yolov1-cfg网络配置文件写出caffe的网络配置文件prototex格式 ;

2、使用模型参数转换工具,将yolov1.weights 转换成 caffemodel格式 ;

3、可以使用  测试网络gnet_test.prototxt  训练配置成参数gnet_solver.prototxt  训练网络gnet_train.prototxt

      基于上述换成的模型参数的基础上进行训练;

4、注意原作者给出的 yolov1.weights  yolov1-cfg是 在voc数据集上训练的,目标种类20;

1.2 caffe-yolo-v2

我的github代码  点击打开链接

参考代码  点击打开链接

yolo-v2 darknet主页  点击打开链接

步骤上述 yolo-v1-caffe的步骤类似。

需要注意的是,原作者给出的有好多种网络框架以及对应的网络参数权重文件

常用的是 基于voc数据集(20类) 和 coco数据集(80类)不过这些的网络主题没什么区别,主要是最后几层网络分类输出是类别数量不同,卷积核数量有所不同。

1.3 caffe-yolo-v3 后面补上


2、SSD目标检测框架

2.1、原作者VGG16-SSD

我的github代码  点击打开链接

原作caffe代码   点击打开链接

VGG16框架 以及SSD结构请参考上述github以及网络资源和论文等资料

步骤:

0、创建符合ssd的训练图片数据库文件  

    参考原作caffe代码 

./data/VOC0712/create_list.sh

1、使用作者提供的 ssd_pascal.py 文件生成基于pascal VOC数据集的 VGG16-SSD目标检测的

    一系列配置文件,包括训练、测试、检测网络框架prototex文件

   ssd_33_train.prototxt

   ssd_33_test.prototxt

   ssd_33_deploy.prototxt

   以及训练参数文件 ssd_33_solver.prototxt

    还有 目标检测脚本 ssd_detect.py

2、预训练模型权重文件可下载VGG_ILSVRC_16_layers_fc_reduced.caffemodel  点击打开链接  casdn上也有

3、使用 VGG_VOC0712_SSD_300x300.sh 脚本进行训练

2.2、squeezeNet-SSD

我的 github参考 点击打开链接

SqueezeNet-V1 V2 原作者caffe参考 点击打开链接


参考原作者 VGG16-SSD 的网络配置文件以及 squeezeNet的网路配置文件

写出自己的 squeezeNet-SSD配置文件。

注意 网络的前部分  squeezeNet的各层名字应该与 squeezeNet的网路配置文件相同,

这样可以基于  squeezeNet的权重文件进行训练。

2.3、MobileNet-SSD

我的 github参考  点击打开链接

MobileNet

caffe参考 点击打开链接

步骤:

参考原作者 VGG16-SSD 的网络配置文件以及  MobileNet 的网路配置文件

写出自己的  MobileNet-SSD配置文件。这也有V1和V2版本

注意点与上面的一样。

2、4 shuffleNet-ssd 

参考:

shuffleNet caffe代码  点击打开链接

含有网络的前部分的 权重文件
我修改后的 shufflenet-ssd    点击打开链接
这里需要重新编译 caffe-ssd 源码,添加
通道重排层的 三个文件 :
shuffle_channel_layer.cpp
shuffle_channel_layer.cu
shuffle_channel_layer.hpp

修改 caffe.proto文件

message LayerParameter {
...
optional ShuffleChannelParameter shuffle_channel_param = 164;
...
}
...
message ShuffleChannelParameter {
  optional uint32 group = 1[default = 1]; // The number of group
}

重新编译

make clean
make all -j
make pycaffe
这里需要注意的是:
组通道卷积DW卷积起始就是分组卷积的特殊情况,当分组数量等于 输入数据的通道数量时。
有的 shufflenet 除了添加了 
shuffle_channel层 ,还添加了 DW卷积层 其实这里可以不用,
就用普通的卷积层代替,添加一个group参数,且数值为 上一层的输出通道数量


猜你喜欢

转载自blog.csdn.net/xiaoxiaowenqiang/article/details/80577654