精华内容
参与话题
问答
  • MobileNet的一些理解

    2018-11-28 18:34:29
    MobileNet 的思想: 传统的深度学习网络进行卷积操作时,常常默认卷积核的深度与输入(DF)的深度保持一致,通过设置卷积核的大小k、步长以及数目N来提取图像的特征,这样一次卷积操作的总运算量是 DK*DK*M*N*DF*...

    资料来源:https://blog.csdn.net/mao_feng/article/details/75116085

    MobileNet 的思想:

    传统的深度学习网络进行卷积操作时,常常默认卷积核的深度与输入(DF)的深度保持一致,通过设置卷积核的大小k、步长以及数目N来提取图像的特征,这样一次卷积操作的总运算量是

    DK*DK*M*N*DF*DF

    MobileNet采用的方法是将采用两次卷积的方式,第一次卷积时,卷积核的深度设为1,运算量为DK*DK*M*DF*DF,第二次卷积时,采用1x1卷积的方式打通通道,运算量是M*N*DF*DF

    通过这种方式能极大的减少模型运算量。

    MobileNet_v2优化的一些理解:

    2 conclusion:Linear Bottleneck的细微改进:

    首先是加入了bottleneck,从而进一步缩小了模型的参数量,并且采用先升维后降维的方法做bottleneck,实验证明效果更好;

    其次,当维度增加以后,进行Relu操作,而当维度下降以后,取消relu操作,这是因为当维度很多时,对特征的表达能力较强,甚至有可能出现不同维度表示的是统一特征的信息,因此使用Relu在减少计算量的同时,不会对模型的精度造成影响,另一方面,当维度很少时,Relu的使用会武断的去掉一部分有用特征表述,从而造成特征丢失。

    展开全文
  • MobileNet-v1和MobileNet-v2

    千次阅读 2018-07-25 17:33:35
    MobileNet-v1: MobileNet主要用于移动端计算模型,是将传统的卷积操作改为两层的卷积操作,在保证准确率的条件下,计算时间减少为原来的1/9,计算参数减少为原来的1/7. MobileNet模型的核心就是将原本标准的卷积操作...

    MobileNet-v1:

    MobileNet主要用于移动端计算模型,是将传统的卷积操作改为两层的卷积操作,在确保准确率的前提下,将计算时间压缩为原来的1/9,计算参数压缩为原来的1/7.

    MobileNet模型的核心就是将原本标准的卷积操作因式分解成一个depthwise convolution和一个1*1的pointwise convolution操作。简单讲就是将原来一个卷积层分成两个卷积层,其中前面一个卷积层的每个filter都分别只跟input的对应一个channel进行卷积,然后后面一个卷积层则负责combining,即将上一层卷积的结果进行信息合并糅合。 

    depthwise convolution:

    比如输入的图片是Dk*Dk*M(Dk是图片大小,M是输入的渠道数),那么有M个Dw*Dw的卷积核,分别去跟M个渠道进行单独卷积,输出Df*Df*M结果

    pointwise convolution:

    对Df*Df*M进行卷积合并,有1*1*N的卷积核,进行常规卷积,输出Df*Df*N的结果

    上面经过这两个卷积操作,从一个Dk*Dk*M=>Df*Df*N,相当于用Dw*Dw*N的卷积核进行常规卷积的结果,但计算量从原来的DF*DF*DK*DK*M*N减少为DF*DF*DK*DK*M+DF*DF*M*N.

    网络结构:

    第一层为常规卷积,后面接着都为depthwise convolution+pointwise convolution,最后两层为Pool层和全连接层,总共28层.

     

    MobileNet-v2:

    两点改变:

    (1) . Inverted residuals(倒置残差) : 通常的residuals block是通过1*1的卷积核将渠道减小,再经过3*3卷积,最后再通过1*1的卷积核从而将渠道数扩大回去,从而减少计算量.而Inverted residuals刚好相反,通过先扩大渠道数再进行卷积,最后再缩小回原来的渠道数.基本思想就是,通过将渠道数扩大,从而在中间层学到更多的特征,最后再总结筛选出优秀的特征出来.

    (2) . Linear bottlenecks : 为了避免Relu函数对特征的损失,在最后经过1*1的卷积缩小渠道数后,放弃采用Relu激活函数,采用线性激活函数,在进行Eltwise sum操作.基本思想便是:在经历了1*1的卷积,降低渠道数,这个已经使某些信息丢失,而外,当特征渠道数变小,大部分的值都会趋向小于0,最后经过Relu激活函数,将再导致丢失一些特征信息.

    MobileNet-v1 和 MobileNet-v2的对比:

    MobileNet-v2 和 ResNet对比:

    MobileNet_v2模型结构:

     

    里面有两个地方弄错了:

    (1) : block_7_3的第一个pw的卷积核由1*1*96改为1*1*960

    (2) : block_11的输入图片由1^2*num_class改为1^2*1280

     

    tensorflow相关实现代码:

    #mobilenet_v1
    def mobilenet_v1(x, input_filters, output_filters, kernel, strides , mode):
        with tf.variable_scope('mobilenet_v1'):
            depthwise_filter = tf.Variable(tf.truncated_normal([kernel,kernel,input_filters,1], stddev=0.1), name='dw_weight')
            pointwise_filter = tf.Variable(tf.truncated_normal([1,1,input_filters,output_filters], stddev=0.1), name='pw_weight')
            x_padded = tf.pad(x, [[0, 0], [kernel // 2, kernel // 2], [kernel // 2, kernel // 2], [0, 0]], mode=mode)
            return tf.nn.separable_conv2d(x_padded, depthwise_filter, pointwise_filter, strides = [1, strides, strides, 1], padding = 'VALID')
    
    #mobilenet_v2
    def mobilenet_v2(x, input_filters, output_filters, kernel, strides , mode):
        with tf.variable_scope('mobilenet_v2'):
            x_padded = tf.pad(x, [[0, 0], [kernel // 2, kernel // 2], [kernel // 2, kernel // 2], [0, 0]], mode=mode)
            pw_wight_1 = tf.Variable(tf.truncated_normal([1,1,input_filters,input_filters*4], stddev=0.1), name='pw_weight_1')
            pw_1 = relu(tf.nn.conv2d(x_padded, pw_wight_1, strides=[1, 1, 1, 1], padding='VALID', name='pw_1'))
    
            depthwise_filter = tf.Variable(tf.truncated_normal([kernel,kernel,input_filters*4 ,1], stddev=0.1), name='dw_weight')
            pointwise_filter = tf.Variable(tf.truncated_normal([1,1,input_filters*4,output_filters], stddev=0.1), name='pw_weight')
            return tf.nn.separable_conv2d(pw_1, depthwise_filter, pointwise_filter, strides = [1, strides, strides, 1], padding = 'VALID')

     

    展开全文
  • mobilenet

    千次阅读 2017-09-26 12:15:37
    mobilenet 在速度、模型大小上做了优化,并保持精度基本不变。 mobilenet 采用了depthwise separable convolutions(L. Sifre. Rigid-motion scattering for image classification, 2014. 1, 3) 的思想,在用3x3(或...

    mobilenet 在速度、模型大小上做了优化,并保持精度基本不变。



    mobilenet 采用了depthwise separable convolutions(L. Sifre. Rigid-motion scattering for image classification, 2014. 1, 3) 的思想,在用3x3(或更大尺寸)卷积的时候并不对通道进行融合,而是采用depthwise(或叫channelwise)和1x1 pointwise的方法进行分解卷积。如下图


    计算量从降低为


    整个mobilenet的架构如下图


    为了更好地控制计算量,mobilenet引入Width Multiplier和Resolution Multiplier分别对网络进行瘦身和降低分辨率。

    在图片分类任务上其大致的效果如下



    mobilenet_v1.png

    在更多任务上的比较见作者文章: https://arxiv.org/pdf/1704.04861.pdf

    有tensorflow的实现: https://github.com/tensorflow/models/blob/master/slim/nets/mobilenet_v1.md

    caffe也有人实现: https://github.com/shicai/MobileNet-Caffe, 他是通过caffe 的group参数来实现channelwise的操作的,由于实现的问题和cuda/cudnn对其支持得不好,训练起来十分慢。前向预测时在CPU上的耗时大概是googlenet的70%。

    展开全文
  • MobileNet是SSD模型的精简版,速度更快,因为SSD检测一百多个对象,而MobileNet只检测20种物体,速度比较快,可以实时检测。 mobilenet模型下载:https://github.com/weiliu89/caffe/tree/ssd#models,下载PASCAL ...

    MobileNet是SSD模型的精简版,速度更快,因为SSD检测一百多个对象,而MobileNet只检测20种物体,速度比较快,可以实时检测。

    mobilenet模型下载:https://github.com/weiliu89/caffe/tree/ssd#models,下载PASCAL VOC models下的第一个,其里面包含模型文件和描述文件,对于类别文件,可以打开opencv里的例程

    E:\anzhuang\opencv3.4.1\opencv\sources\samples\dnn\ssd_mobilenet_object_detection.cpp,例程里列出了这20种对象,在此程序上进行修改如下:

    #include<opencv2\opencv.hpp>
    #include<opencv2\dnn.hpp>
    using namespace cv;
    using namespace std;
    using namespace dnn;
    
    const size_t inWidth = 300;
    const size_t inHeight = 300;
    const float inScaleFactor = 0.007843f;
    const float meanVal = 127.5;
    const char* classNames[] = { "background",
    "aeroplane", "bicycle", "bird", "boat",
    "bottle", "bus", "car", "cat", "chair",
    "cow", "diningtable", "dog", "horse",
    "motorbike", "person", "pottedplant",
    "sheep", "sofa", "train", "tvmonitor" };
    
    
    int main(int argc, char** argv)
    {	
    	namedWindow("input", CV_WINDOW_AUTOSIZE);
    	Mat src = imread("1.jpg");
    	imshow("input",src);
    	String modelConfiguration = "deploy.prototxt";
    	String modelBinary = "VGG_VOC0712_SSD_300x300_iter_120000.caffemodel";
    	//读入模型和描述文件
    	Net net = readNetFromCaffe(modelConfiguration, modelBinary);	
    	//将图像转为网络输入的模式
    	Mat inputBlob = blobFromImage(src, inScaleFactor, Size(inWidth, inHeight), Scalar(meanVal, meanVal, meanVal), false, false);
    	//输入网络							 					
    	net.setInput(inputBlob,"data"); 		
    	//前向传播	
    	Mat detection = net.forward("detection_out"); 								 
    	Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());
    	//设置置信度阈值
    	float confidenceThreshold = 0.06;
    		
    		for (int i = 0; i < detectionMat.rows; i++)
    		{
    			float confidence = detectionMat.at<float>(i, 2);
    
    			if (confidence > confidenceThreshold)
    			{
    				size_t objectClass = (size_t)(detectionMat.at<float>(i, 1));
    
    				int tl_x = static_cast<int>(detectionMat.at<float>(i, 3) * src.cols);
    				int tl_y = static_cast<int>(detectionMat.at<float>(i, 4) * src.rows);
    				int br_x = static_cast<int>(detectionMat.at<float>(i, 5) * src.cols);
    				int br_y = static_cast<int>(detectionMat.at<float>(i, 6) * src.rows);
    
    				rectangle(src, Point(tl_x, tl_y), Point(br_x, br_y), Scalar(0, 255, 0));
    				String label = format("%s: %.2f", classNames[objectClass], confidence);
    		
    				putText(src, label, Point(tl_x, tl_y), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0));
    			}
    		}
    		imshow("detections", src);
    		waitKey(0);
    		return 0;	
    	}
    

     

    展开全文
  • 首先,在目标检测中常说到两个名词,“backbone”,“head”? 如果小伙伴已经在这个领域摸爬滚打一阵,估计说,这也要说嘛,但是每个人都是从不会到会的,也许一句话,就可以解决别人心中很久的疑惑,对吗?...
  • MobileNet

    2019-05-31 17:05:14
    转载自:...文章全名:MobileNets: Efficient Convolutional Neural Networks for MobileVision Applications 1.原文链接 论文地址:https://arxiv.org/abs/1704.04861 2.简介 伴随着模...
  • mobilenet简述

    千次阅读 2017-10-16 10:36:09
    mobilenet 在速度、模型大小上做了优化,并保持精度基本不变。mobilenet 采用了depthwise separable convolutions(L. Sifre. Rigid-motion scattering for image classification, 2014. 1, 3) 的思想,在用3x3(或...
  • MobileNet是针对移动端优化的卷积,所以当需要压缩模型时,可以考虑使用MobileNet替换卷积。下面我们开始学习MobileNet原理,并且先通过Tensorflow函数接口实现MobileNet,再手写python代码实现MobileNet
  • 【深度学习MobileNet】——深刻解读MobileNet网络结构

    万次阅读 多人点赞 2018-06-15 12:49:48
    本文转载自:引言卷积神经网络(CNN)已经普遍应用在计算机视觉领域,并且已经取得了不错的效果。图1为近几年来CNN在ImageNet竞赛的表现,可以看到为了追求分类准确度,模型深度越来越深,模型复杂度也越来越高,如...
  • pytorch实现MobileNet

    千次阅读 热门讨论 2019-01-26 23:02:21
    MobileNet是一个轻量级深度神经网络。 创新点: 主要应用了深度可分离卷积来代替传统的卷积操作,并且放弃pooling层。把标准卷积分解成深度卷积(depthwise convolution)和逐点卷积(pointwise c...
  • MobileNet-Caffe Introduction This is a Caffe implementation of Google's MobileNets (v1 and v2). For details, please read the following papers: [v1] MobileNets: Efficient Convolutional Neural ...
  • MobileNet v2 算法笔记

    万次阅读 热门讨论 2018-01-29 23:09:16
    论文:Inverted Residuals and Linear Bottlenecks Mobile Networks for Classification, Detection and Segmentation 链接:https://128.84.21.199/abs/1801.04381 第三方代码(可用于在ImageNet数据集上训练):...

空空如也

1 2 3 4 5 ... 20
收藏数 74,365
精华内容 29,746
关键字:

mobile