MobileNet学习记录-基于MobileNetV1的自动驾驶图像语义分割实现

1. MobileNet基础及架构

Mobielnet学习记录-概念篇

 

2. 实现思路

为了便于实现,还是采用了Encoder-Decoder结构,利用MobileNet来进行特征提取,相较于CNN的卷积操作,最大的不同就是MobileNet的深度可分离卷积,其他步骤基本一样。

MobileNet的网络结构如上图所示,首先通过一个3x3的标准卷积(步长为2),然后经过多个深度可分离卷积,特征提取完成后,然后采用平均池化将feature变成1x1,根据预测类别大小加上全连接层,最后经过softmax层求取类别概率。

对于Encoder部分,因为有多个Depth卷积和Point卷积,因此可以写一个函数将这两步整合起来,然后根据MobileNet架构图来进行对应的操作。

其中alpha参数:在MobileNet v1版本中的可分离卷积被分为两部分,分别为深度卷积(depth_wise)和点卷积( and point_wise),这两个卷积对应的参数分别是depth_multiplier和alpha,这两个参数是为了在节省计算与保持accuracy之间寻找一个平衡点,为此使用alpha参数来调节每层的宽度,它可用来影响input channels M及output channels N的数目。若施加了alpha参数,那么在真正计算时所用的M与N将分别为alpha * M与alpha x*N。它又叫缩减参数/宽度参数,宽度乘数alpha的作用是在每层均匀地稀疏网络。

对于给定的图层在宽度乘数α和输入通道数M变为αM,输出通道数N变为αN时。具有宽度乘数α的深度可分卷积的计算成本为公式: 

其中α的取值范围为(0,1),一般的设置为0.25,0.5,0.75,1,当α<1的时候就减少了MobileNets的宽度。宽度乘数具有通过大致α的平方地去减少计算成本和参数数量的效果,宽度乘数可以应用于任何模型结构,以定义具有合理精度,延迟和大小权衡的新的较小模型,它用于定义需要从头开始训练的新的简化结构。

3.实现过程

①Depthwise_Conv函数

def Depth_Conv(inputs, pointwise_conv_filters, alpha,
			   multiplier, strides=(1, 1), layer=1):

	channel_axis = 1 \
		if IMAGE_ORDERING == 'channels_first' \
		else -1
	pointwise_conv_filters = int(pointwise_conv_filters * alpha)

	Img_Conv = ZeroPadding2D((1, 1) , data_format=IMAGE_ORDERING , name='conv_pad_%d' % layer)(inputs)
	Img_Conv = DepthwiseConv2D((3, 3) , data_format=IMAGE_ORDERING ,
														 padding='valid',
														 depth_multiplier=multiplier,
														 strides=strides,
														 use_bias=False,
														 name='conv_dw_%d' % layer)(Img_Conv)
	Img_Conv = BatchNormalization(
			axis=channel_axis, name='conv_dw_%d_bn' % layer)(Img_Conv)
	Img_Conv = Activation(relu6, name='conv_dw_%d_relu' % layer)(Img_Conv)

	Img_Conv = Conv2D(pointwise_conv_filters, (1, 1), data_format=IMAGE_ORDERING ,
										padding='same',
										use_bias=False,
										strides=(1, 1),
										name='conv_pw_%d' % layer)(Img_Conv)
	Result = BatchNormalization(axis=channel_axis,name='conv_pw_%d_bn' % layer)(Img_Conv)
	return Activation(relu6, name='conv_pw_%d_relu' % layer)(Result)

该函数主要用于处理深度可分离卷积块,接收inputs, pointwise_conv_filters(点卷积了滤波器), alpha, depth_multiplier(depth_multiplier参数), strides, layer六个参数,首先还是经过一个ZeroPadding2D使图像大小保持不变,再经过一个3*3的DepthwiseConv2D,然后经过批标准化处理,再用relu6函数激活,再通过一个1*1卷积的Conv2D,padding方式为same,之后再经过批标准化处理,最后返回经relu6激活后的结果。

②Conv函数

def Conv(inputs, filters, alpha, kernel=(3, 3), strides=(1, 1)):

	channel_axis = 1 \
		if IMAGE_ORDERING == 'channels_first' \
		else -1
	filters = int(filters * alpha)
	Img_Conv = ZeroPadding2D(padding=(1, 1), name='layer1_pad', data_format=IMAGE_ORDERING  )(inputs)
	Img_Conv = Conv2D(filters, kernel , data_format=IMAGE_ORDERING  ,
										padding='valid',
										use_bias=False,
										strides=strides,
										name='layer1')(Img_Conv)
	Result = BatchNormalization(axis=channel_axis, name='layer1_bn')(Img_Conv)
	return Activation(relu6, name='layer1')(Result)

Conv函数接收到传来的参数后,将filter与宽度乘数α相乘并取整作为新的filter,然后对其进行ZeroPadding2D,padding=(1, 1),再经过Conv2D函数进行卷积,这里用的是新卷积核,再通过一次批标准化处理,最后用激活函数relu6(最大值为6)并返回处理后的结果,该函数主要用来进行结构中的第一次卷积操作。

③特征提取过程

def MobileNet_Encoder( input_height=224 ,  input_width=224 ):

	alpha=0.5
	multiplier=1

	img_input = Input(shape=(input_height, input_width, 3 ))

	Img_In = Conv(img_input, 32, alpha, strides=(2, 2))
	Img_In = Depth_Conv(Img_In, 64, alpha, multiplier, layer=1) 
	layer1 = Img_In

	Img_In = Depth_Conv(Img_In, 128, alpha, multiplier,
														strides=(2, 2), layer=2)  
	Img_In = Depth_Conv(Img_In, 128, alpha, multiplier, layer=3) 
	layer2 = Img_In

	Img_In = Depth_Conv(Img_In, 256, alpha, multiplier,
														strides=(2, 2), layer=4)  
	Img_In = Depth_Conv(Img_In, 256, alpha, multiplier, layer=5) 
	layer3 = Img_In

	Img_In = Depth_Conv(Img_In, 512, alpha, multiplier,
														strides=(2, 2), layer=6) 
	Img_In = Depth_Conv(Img_In, 512, alpha, multiplier, layer=7) 
	Img_In = Depth_Conv(Img_In, 512, alpha, multiplier, layer=8) 
	Img_In = Depth_Conv(Img_In, 512, alpha, multiplier, layer=9) 
	Img_In = Depth_Conv(Img_In, 512, alpha, multiplier, layer=10) 
	Img_In = Depth_Conv(Img_In, 512, alpha, multiplier, layer=11) 
	layer4 = Img_In 

	return img_input , [layer1 , layer2 , layer3 , layer4 ]

首先输入图片shape依旧为224*224,通道数为3,为进行对比,先将两个参数alpha和multiplier都设置为1,然后再更改参数比较模型参数量和模型大小的变化。

第一层:进行Conv函数,filters为32,步长为(2,2),对图片进行卷积操作,再通过Depthwise_Conv函数进行卷积,filters为64,分别对块号进行标记,最终输出特征层命名为layer1。

第二层:进行两次Depthwise_Conv函数,filters为128,分别对块号进行标记,最终输出特征层命名为layer2。

第三层:进行两次Depthwise_Conv函数,filters为256,分别对块号进行标记,最终输出特征层命名为layer3。

第四层:进行六次Depthwise_Conv函数,filters为512,分别对块号进行标记,最终输出特征层命名为layer4。

  最后将卷积处理后的结果保存传入Decoder部分,获取经过四次压缩后的特征图,将特征层传入SegNet的解码网络进行解码。

④解码过程

与CNN的解码过程一样,就是相同的上采样扩张操作。

4.训练结果

                                                                                      图1  CNN参数量

                                 

                                                                                  图2  MobileNet参数量

MobileNet的总参数(在alpha参数为1的情况下)如图2所示为5541378个,相比于CNN减少了6007424个参数。

                                                                                     图3  MobileNet模型大小

                                                                                图4  CNN模型大小

如图3图4所示,MobileNet生成的h5文件大小为12541KB,而CNN生成的h5文件大小为45188KB,是MobileNet的3至4倍,可见MobileNet这种轻型网络作为主干网络确实可以明显减小模型大小。

 

                                                                       图5. Mobielnet

                                                                        图6. Mobielnet训练集准确率

                                                                         图7. Mobielnet验证集准确率

                                                                          图8. 原图

                                                                         图9. 分割图

自己电脑跑不起来,用师兄的电脑跑了一下,总的来说效果还不错图8图9是用camvid训练30epoch的效果,如果训练的epoch多一些的话效果会更好一些。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MobileNetV2-6a65762b.pth是一个用于深度学习的预训练模型。MobileNetV2是一种轻量级的卷积神经网络结构,适用于在移动设备和嵌入式设备上部署。 模型文件的后缀.pth表示它是由PyTorch框架保存的模型权重文件。PyTorch是一个广泛使用的开源深度学习框架,可用于构建、训练和部署各种深度学习模型。 在MobileNetV2模型中,6a65762b是一个唯一的标识符,可能代表了该模型的某个版本或者某个训练实例的标识符。 使用这个预训练模型可以帮助开发者更快速地构建和训练自己的深度学习模型。通过加载这个预训练模型的权重,我们可以利用该模型在大规模数据集上的预训练结果,从而使得我们在更小规模的数据集上能够更好地实现迁移学习和快速训练。 通过加载这个.pth文件,我们可以使用它提供的模型架构和训练好的权重参数来进行图像分类、目标检测或其他相关任务。这个预训练模型具有较高的准确度和较低的模型复杂度,适用于资源受限的设备上的深度学习应用。 总结来说,mobilenet_v2-6a65762b.pth是一个用于深度学习任务的预训练模型文件,结合MobileNetV2网络架构和训练好的权重参数,可以帮助我们在移动设备和嵌入式设备上构建高效、准确的深度学习模型。 ### 回答2: mobilenet_v2-6a65762b.pth是一个模型文件,它是移动网络MobileNet)v2模型的一个版本。MobileNet是一种轻量级的卷积神经网络,特别适用于移动设备和嵌入式系统上的计算资源受限环境。MobileNet v2是MobileNet的改进版本,通过引入轻量级的残差连接和线性瓶颈结构,在保持模型大小和计算性能的同时,提高了准确度。 mobilenet_v2-6a65762b.pth是训练好的MobileNet v2模型的权重文件。通过使用这个权重文件,可以加载预训练好的MobileNet v2模型,从而进行图像分类、目标检测或特征提取等任务。 在深度学习中,预训练的模型权重文件将模型的参数保存在了.pth文件中,以便在需要的时候直接加载使用。这样做的好处是可以避免重新训练模型,节省时间和计算资源。这个权重文件是由在大规模图像数据集上训练得到的,所以模型已经具有较好的泛化能力,可以在各种图像数据上进行有效的预测。 加载mobilenet_v2-6a65762b.pth文件,可以实现快速且准确的图像识别和分类,广泛应用于计算机视觉领域。在图像分类任务中,该模型可以识别不同物体的类别,例如识别猫、狗、汽车等。在目标检测任务中,该模型可以检测图像中的物体位置和边界框信息。而在特征提取任务中,该模型可以提取出图像的高层语义特征,作为其他任务的输入或用于图像相似度比较等用途。 总之,mobilenet_v2-6a65762b.pth是一个预训练好的MobileNet v2模型权重文件,使用它可以方便地加载MobileNet v2模型,实现高效准确的图像分类、目标检测和特征提取等任务。 ### 回答3: mobilenet_v2-6a65762b.pth是一个预训练的模型文件,用于MobileNetV2模型的权重初始化。MobileNetV2是一种轻量级的卷积神经网络架构,用于图像分类和目标检测任务。该模型文件包含了已经在大规模数据集上训练好的权重参数,可以直接加载到相应的模型中进行使用。 mobilenet_v2-6a65762b.pth文件的命名规则通常以模型名称和一串唯一的标识符组成,用于区分不同版本或训练过程中的不同阶段。其中,6a65762b是一个标识符,用于确保文件的唯一性。 通过加载mobilenet_v2-6a65762b.pth文件,我们可以利用预训练的权重参数来加速模型的训练过程,并提高模型的性能表现。这是因为预训练权重已经在大规模数据集上进行了充分的训练,具有良好的特征提取能力和泛化能力。在加载预训练权重后,我们可以在较小的数据集上进行微调或进行迁移学习,从而在更小的计算成本内获取较好的结果。 总之,mobilenet_v2-6a65762b.pth是MobileNetV2模型的预训练权重文件,使用它可以帮助我们快速构建和训练具有强大特征提取能力的轻量级卷积神经网络

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值