轻量级目标检测框架MobileNet-SSD在Caffe下实现的流程步骤


本篇博客将涉及对Mobilenet-v1的简单介绍、Mobilenet-SSD的下载及文件说明、网络训练部分、网络测试部分、批归一化融合验证、finetune训练、DepthwiseConvolution即深度可分离卷积在caffe下的实现等内容。

数据集制作及下载请参考我的这篇博客:目标检测SSD网络在Caffe下的实现——基于VOC0712数据集


数据来源:VOC0712、NEUDataset
模型:MobileNet-SSD(基于MobileNet-v1)
系统:Linux-Ubuntu


MobileNet-v1介绍

论文链接:MobileNets: EfficientConvolutionalNeuralNetworksforMobileVision Applications

MobileNet是Google提出了一个轻量型网络模型,其发展到今天一共有v1、v2、v3三种变形和升级。

本次只涉及到v1的简单讲解。

v1使用深度可分离卷积(depthwise separatable convolutions),即Xception变体结构构建了一个轻量级的深度网络,模型大小只有十几M。

  • 深度可分离卷积

    是将标准卷积分解为深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)。

  • 标准卷积

    对于一次卷积过程
    输入F:(DF,DF,M),其中DF表示输入feature map尺寸,M表示输入特征维度;
    卷积核K:(DK,DK,M,N),其中DK表示卷积核尺寸,N表示有多少个卷积核,即输出的特征维度;
    输出G:(DG,DG,DG,N),其中DG表示输出feature map尺寸,N表示输出特征维度;
    计算量: DK x DK x M x N x DF x DF

  • 深度可分离卷积

    输入F:(DF,DF,M),其中DF表示输入feature map尺寸,M表示输入特征维度;
    depthwise:(DK,DK,1,M),其中M表示用M个卷积核对输入M个通道作卷积操作(是对应进行操作的吗?),输出通道也为M;
    输出:(DG,DG,DG,M),深度卷后的输出
    pointwise: (1,1,M,N),卷积核尺寸为1X1,输出通道为N,表示用N个1x1卷积核对输入M个通道分别作卷积,输出为N个通道;
    输出G:(DG,DG,DG,N);
    计算量: DK x DK x 1 x M x DF x DF + M x N x DG x DG

  • 计算量对比

    标准卷积 / 深度卷积= N + DK2
    在这里,为了便于计算量对比值,对于深度可分离卷积的计算量 DG x DG部分简化为DF x DF,因为一般来说 DG x DG小于DF x DF,更能说明计算量的对比明显,即使用深度可分离卷积操作,MobileNet-v1显著降低了模型的参数。

因此可以看出深度卷积(depthwise)完成的操作是改变feature map的尺寸大小,而逐点卷积(pointwise)相当于对feature map作全卷积操作,改变的是输出的通道数。

本质上完成的功能和标准卷积一致,但是降低了模型参数。
在这里插入图片描述


  • 使用MobileNet作为特征提取网络,以SSD和Faster-RCNN为例,在coco数据集上mAP值对比:

在这里插入图片描述

MobileNet-SSD下载及文件说明

我使用的是Github上chuanqi305的网络结构: Github-MobileNet-SSD下载
在这里插入图片描述


文件名 文件说明
images 测试模型图片
template train、test、deploy模板网络结构,在使用gen_model.sh自动生成针对不同类别下的网络结构时会用到
voc 以voc 21个类别生成的网络结构
mobilenet_iter_73000.caffemodel 其训练好的网络模型
demo.py 测试用的脚本代码
gen.py 生成网络结构的代码
merge_bn.py 融合batch_normalization层,用在测试推理过程中,可以提高推理速度
gen_model.sh 针对具有不同类别数量数据集生成相应的网络结构,需要用到template下的文件
test.sh 进行模型测试,给出loss和mAP值
train.sh 进行模型训练
train_voc.sh 对VOC进行训练,区别不大
deploy.prototxt和train.prototxt 网络结构
solver_test.prototxt和solver_train.prototxt 训练和测试时的超参设置

针对VOC0712数据集训练

先说明一下,这部分没有成功。

用MobileNet-SSD对VOC0712数据集直接训练,mAP值低的出乎意料

起初,我怀疑是数据集制作有问题,但是我用同样的数据集在vgg-ssd下可以达到一个和官方差不多的结果即mAP值,可以参考我的这篇博客(目标检测SSD网络在Caffe下的实现——基于VOC0712数据集),所以不会是数据集的问题。

后来我去详细看了一下README.md文件,原来作者是将tensorflow下训练好的模型转成了caffemodel,然后又在coco数据集下进行预训练,最后才在VOC数据集下进行训练才达到一个mAP=0.727的效果。

  • 作者原话如下:

I trained this model from a MobileNet classifier(caffemodel and prototxt) converted from tensorflow.
I first trained the model on MS-COCO and then fine-tuned on VOC0712.
Without MS-COCO pretraining, it can only get mAP=0.68.

所以我就先不在voc数据集进行训练了。


对作者训练好的模型进行测试

直接进行模型测试

使用的模型:作者训练好的mobilenet_iter_73000.caffemodel
使用的网络结构:deploy.prototxt

  • 精度测试
 sudo sh test.sh

结果如下图,精度为0.726,和作者给出的mAP差不多。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,这里简单介绍一下如何使用caffe-ssd预训练模型进行目标检测caffe-ssd是基于caffe框架实现的单阶段目标检测算法,使用预训练模型可以加快模型训练的速度,同时也可以提高模型的检测精度。下面是使用预训练模型做目标检测步骤: 1. 下载预训练模型 caffe-ssd官方提供了一些预训练模型,可以在这里下载:https://github.com/weiliu89/caffe/tree/ssd#models。选择适合自己数据集的模型进行下载。 2. 准备数据集 准备自己的数据集,包括训练集、验证集和测试集。数据集需要满足SSD数据格式要求,即每个样本需要有对应的标注文件,标注文件格式为:类别id、xmin、ymin、xmax、ymax(例如:0 0.1 0.2 0.3 0.4,表示类别为0,左上角坐标为(0.1, 0.2),右下角坐标为(0.3, 0.4))。 3. 修改配置文件 修改caffe-ssd的配置文件,将模型路径、数据路径、类别数等参数配置正确。其中,模型路径需要指定为下载的预训练模型路径。 4. 训练模型 使用修改后的配置文件训练模型。训练过程中可以调整学习率、迭代次数等参数,以达到更好的效果。 5. 测试模型 使用测试集对训练好的模型进行测试,并计算模型在测试集上的精度和召回率等指标。 以上就是使用caffe-ssd预训练模型做目标检测的基本步骤。需要注意的是,使用预训练模型虽然可以加速模型训练过程,但是如果数据集和预训练模型的差异较大,仍然需要进行微调。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值