top of page
アンカー 1

一、前文回顾

上一节用VGG16训练了手势识别,这节用轻量级的神经网络模型MobileNet来实现。


二、关键词语

MobileNetV2:一个轻量化卷积神经网络,具有网络参数少运算速度快的优点。


三、实现思路

1.用Mediapipe来找到一幅图像中手的位置。

2.采集手势图像,每个手势1000张,0-5的手势总共6000张图像

3.使用MobileNetV2神经网络以及imagenet权重进行迁移学习。

4.通过以上步骤会得到我们自己的权重,然后就可以进行识别了。


四、核心代码


# 调用MobileNet模型,如果参数 weights ='imagenet',则读取 ImageNet 学习到的权重数据。
# include_top=False 不包含输出层的全结合层
mobileNet = tf.keras.applications.mobilenet_v2.MobileNetV2(weights="imagenet", include_top=False,input_tensor=tf.keras.Input(shape=(224, 224, 3)),input_shape=(224, 224, 3))

创建一个MobileNetV2网络模型,使用imagenet权重作为初始权重,不包含 MobileNetV2的输出端的全连接层(因为我们是6个分类,所以需要自定义全连接层)


# 冻结mobileNet的部分参数(不参加训练)
# mobileNet.trainable = False
layer_names = [l.name for l in mobileNet.layers]
idx = layer_names.index('block_12_expand')
print(idx)
mobileNet.trainable = True
for layer in mobileNet.layers[:idx]:
    layer.trainable = False    

冻结MobileNetV2的部分(划重点,是部分参数)参数,这样他们就不会参加训练,从而减小训练时间。一开始我以为全部冻结比较好,结果经过几次训练,发现把block_12_expand层以前参数冻结效果比较好。全部冻结的话会很容易过拟合,训练精度一直卡在50%左右。


train_images = (2 * train_images / 255 - 1)
valid_images = (2 * valid_images / 255 - 1)    

图像像素归一化的时候,MobileNetV2要归一为-1到1的范围。


# 展开 MobileNet 的最大池化输出
flatten = mobileNet.output
flatten = tf.keras.layers.Flatten()(flatten)
# 添加全连接层
dense = tf.keras.layers.Dense(class_num, activation="sigmoid")(flatten)
# # 定义新的模型,输入为MobileNet,输出为上面定义的全连接层
model = tf.keras.models.Model(inputs=mobileNet.input, outputs=dense)

自定义四层全链接输出层,输出分类为6个,分别对应手势0-6


五、效果视频


六、总结

1.用谷歌的colab来进行训练,只花了一个小时。关键是电脑在训练期间还可以干别的。

2.推理速度比起VGG16快了很多,打算以后放在树莓派来运行。


源码下载:

·深度学习18弹

3 則留言
bottom of page