使用MobileNet进行图像识别
介绍
图像识别是指识别图像中物体或特征的过程。图像识别广泛应用于医疗影像、汽车、安全以及缺陷检测等众多领域。
什么是MobileNet?为什么如此流行?
MobileNet是一种使用深度可分离卷积开发的深度学习CNN模型。与相同深度的其他模型相比,该模型大大减少了参数数量。该模型轻量级,经过优化可在移动和边缘设备上运行。目前已发布三个版本的MobileNet,即MobileNet v1、v2和v3。MobileNet由谷歌开发。
让我们简单了解一下在ML领域存在已久的MobileNet V1和V2。
MobileNetV2比MobileNet V1提供了两个重要的特性:
MobileNetV2在层之间具有线性瓶颈。它通过不允许非线性破坏过多信息来保留信息。
瓶颈之间的短连接。
Mobilenetv2架构
输入 |
操作符 |
T |
C |
N |
S |
---|---|---|---|---|---|
224² X 3 |
conv2d |
— |
32 |
1 |
2 |
112² X 32 |
瓶颈 |
1 |
16 |
1 |
1 |
112² X 16 |
瓶颈 |
6 |
24 |
2 |
2 |
56² X 24 |
瓶颈 |
6 |
32 |
3 |
2 |
28² X 32 |
瓶颈 |
6 |
64 |
4 |
2 |
14² X 64 |
瓶颈 |
6 |
96 |
3 |
1 |
14² X 96 |
瓶颈 |
6 |
160 |
3 |
2 |
7² X 160 |
瓶颈 |
6 |
320 |
1 |
1 |
7² X 320 |
conv2d 1x1 1 |
— |
1280 |
1 |
1 |
7² X 1280 |
avgpool 7x7 |
— |
— |
1 |
— |
1 X 1 X 1280 |
conv2d 1x1 |
— |
k |
— |
— |
MobileNet v1和Mobilenet V2的比较
大小 |
MOBILENETV1 |
MOBILENETV2 |
SHUFFLENET (2X,G=3) |
---|---|---|---|
112X112 |
64/1600 |
16/400 |
32/800 |
56x56 |
128/800 |
32/200 |
48/300 |
28x28 |
256/400 |
64/100 |
400/600K |
14x14 |
512/200 |
160/62 |
800/310 |
7x7 |
1024/199 |
320/32 |
1600/156 |
1x1 |
1024/2 |
1280/2 |
1600/3 |
最大 |
1600K |
400K |
600K |
图像识别的代码实现
示例
## MOBILENET import numpy as np import tensorflow as tf from tensorflow import keras from tensorflow.keras.layers import Dense, Activation from tensorflow.keras.metrics import categorical_crossentropy from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.preprocessing import image from tensorflow.keras.models import Model from tensorflow.keras.optimizers import Adam from tensorflow.keras.applications import imagenet_utils import matplotlib.pyplot as plt from IPython.display import Image,display %matplotlib inline mobile = tf.keras.applications.mobilenet.MobileNet() def format_image(file): image_path = '/content/images/' img = image.load_img(image_path + file, target_size=(224, 224)) img_array = image.img_to_array(img) img_array_exp_dims = np.expand_dims(img_array, axis=0) return tf.keras.applications.mobilenet.preprocess_input(img_array_exp_dims) display(Image(filename='/content/images/image.jpg', width=300,height=200)) preprocessed_img = format_image('image.jpg') prediction_results = mobile.predict(preprocessed_img) results = imagenet_utils.decode_predictions(prediction_results) print(results)
输出
[[('n02279972', 'monarch', 0.58884907), ('n02281406', 'sulphur_butterfly', 0.18508224), ('n02277742', 'ringlet', 0.15471826), ('n02281787', 'lycaenid', 0.04744451), ('n02276258', 'admiral', 0.01013135)]]
MobileNet相对于其他网络的优势
MobileNet具有更高的分类精度和更少的参数。
MobileNet体积小,延迟低,功耗优化,非常适合移动和嵌入式设备。
它们是用于分割和目标检测的高效特征提取器。
图像识别的益处
用于自动驾驶汽车和机器人检测障碍物。
广泛用于OCR技术,从图像中检索信息。
车道线检测。
人脸检测和考勤系统。
图像字幕和标签,在社交媒体网站上有用。
结论
图像识别已成为每个目标检测和视频相关任务的初步任务。由于已经存在大量的预训练模型和架构,它在当前与视觉相关的AI领域变得非常重要。