摘要本文介绍了基于TensorFlow框架构建图像识别系统的实现方法。系统通过卷积神经网络(CNN)模型对64×64像素图像进行分类识别包含数据加载、模型训练和预测三个核心模块。实验采用自定义数据集构建了包含卷积层、池化层和全连接层的深度学习模型使用SGD优化器和交叉熵损失函数进行训练最终达到100%的准确率。模型结构和权重分别保存为JSON和H5格式便于后续部署应用。该系统可扩展应用于安防等实际场景中的图像识别任务。目录基于 TensorFlow 的图像识别图像加载代码load_data.py图像训练代码train.py基于 TensorFlow 的图像识别TensorFlow 内置了专门的图像识别功能待识别的图像需存储在指定文件夹中。对于特征相似度较高的图像借助该功能可轻松实现安防场景下的图像识别逻辑。本文实现图像识别代码的文件夹结构如下此电脑 本地磁盘 (E:) Tensorflow-image-recognition名称修改日期类型大小.idea2018/9/3 21:01文件夹-pycache2018/9/3 20:48文件夹-dataset_image2018/10/15 15:29文件夹-logs2018/10/15 15:31文件夹-int_to_word_out.pickle2018/10/15 15:31PICKLE 文件1KBload_data.py2018/9/3 20:41PY 文件1KBmodel_face.h52018/10/15 15:31H5 文件65604KBmodel_face.json2018/10/15 15:31JSON 文件3KBpredict.py2018/9/3 20:41PY 文件1KBREADME.md2018/9/3 20:41MD 文件2KBtrain.py2018/9/3 20:41PY 文件3KBdataset_image文件夹中存放了需要加载的待识别相关图像本文的图像识别将以该文件夹中自定义的标识图像为识别对象。图像通过load_data.py脚本加载该脚本可辅助记录其中各类图像识别模块的相关信息。图像加载代码load_data.pyimport pickle from sklearn.model_selection import train_test_split from scipy import misc import numpy as np import os # 获取数据集文件夹下的标签 label os.listdir(dataset_image) # 剔除无关文件/文件夹取后续标签 label label[1:] dataset [] # 遍历每个标签对应的图像文件夹 for image_label in label: images os.listdir(dataset_image/ image_label) for image in images: # 读取图像 img misc.imread(dataset_image/ image_label / image) # 将图像缩放至64×64尺寸 img misc.imresize(img, (64,64)) # 存储图像与对应标签 dataset.append((img, image_label)) X [] Y [] # 分离图像特征与标签 for input, image_label in dataset: X.append(input) Y.append(label.index(image_label)) # 转换为numpy数组 X np.array(X) Y np.array(Y) # 定义训练集 X_train, y_train X, Y data_set (X_train, y_train) # 将标签序列化保存至pickle文件 save_label open(int_to_word_out.pickle,wb) pickle.dump(label, save_label) save_label.close()对图像进行训练可将可识别的图像特征模式存储在指定文件夹中以下是图像训练的实现代码。图像训练代码train.pyimport numpy import matplotlib.pyplot as plt from keras.layers import Dropout from keras.layers import Flatten from keras.constraints import maxnorm from keras.optimizers import SGD from keras.layers import Conv2D from keras.layers.convolutional import MaxPooling2D from keras.utils import np_utils from keras import backend as K import load_data from keras.models import Sequential from keras.layers import Dense import keras # 设置图像维度顺序为TensorFlow格式通道在后 K.set_image_dim_ordering(tf) # 固定随机种子保证实验可复现 seed 7 numpy.random.seed(seed) # 加载数据集 (X_train, y_train) load_data.data_set # 将像素值从0-255归一化至0.0-1.0 X_train X_train.astype(float32) X_train X_train / 255.0 # 对标签进行独热编码 y_train np_utils.to_categorical(y_train) # 获取分类数量 num_classes y_train.shape[1] # 构建序贯模型 model Sequential() # 添加卷积层32个3×3卷积核输入尺寸64×64×3同边填充ReLU激活权重最大范数约束3 model.add(Conv2D(32, (3,3), input_shape(64,64,3), paddingsame, activationrelu, kernel_constraintmaxnorm(3))) # 添加Dropout层随机丢弃20%的神经元 model.add(Dropout(0.2)) # 再次添加卷积层 model.add(Conv2D(32, (3,3), activationrelu, paddingsame, kernel_constraintmaxnorm(3))) # 添加最大池化层池化窗口2×2 model.add(MaxPooling2D(pool_size(2,2))) # 展平层将多维特征映射转为一维 model.add(Flatten()) # 全连接层512个神经元ReLU激活 model.add(Dense(512, activationrelu, kernel_constraintmaxnorm(3))) # Dropout层随机丢弃50%的神经元 model.add(Dropout(0.5)) # 输出层分类数对应神经元数softmax激活输出分类概率 model.add(Dense(num_classes, activationsoftmax)) # 编译模型 epochs 10 # 训练轮数 lrate 0.01 # 学习率 decay lrate/epochs # 学习率衰减 # 定义随机梯度下降优化器 sgd SGD(lrlrate, momentum0.9, decaydecay, nesterovFalse) # 损失函数为交叉熵优化器为SGD评估指标为准确率 model.compile(losscategorical_crossentropy, optimizersgd, metrics[accuracy]) # 打印模型结构摘要 print(model.summary()) # 定义回调函数TensorBoard可视化日志保存至logs文件夹 callbacks [keras.callbacks.TensorBoard(log_dir./logs, histogram_freq0, batch_size32, write_graphTrue, write_gradsFalse, write_imagesTrue, embeddings_freq0, embeddings_layer_namesNone, embeddings_metadataNone)] # 训练模型 model.fit(X_train, y_train, epochsepochs, batch_size32, shuffleTrue, callbackscallbacks) # 模型评估 scores model.evaluate(X_train, y_train, verbose0) # 打印识别准确率 print(准确率: %.2f%% % (scores[1]*100)) # 将模型结构序列化为JSON格式并保存 model_json model.to_json() with open(model_face.json, w) as json_file: json_file.write(model_json) # 将模型权重保存为HDF5格式 model.save_weights(model_face.h5) print(模型已保存至本地磁盘)上述代码运行后输出结果如下plaintextLayer (type) Output Shape Param # conv2d_1 (Conv2D) (None,64,64,32) 896 dropout_1 (Dropout) (None,64,64,32) 0 conv2d_2 (Conv2D) (None,64,64,32) 9248 max_pooling2d_1 (MaxPooling2D) (None,32,32,32) 0 flatten_1 (Flatten) (None,32768) 0 dense_1 (Dense) (None,512) 16777728 dropout_2 (Dropout) (None,512) 0 dense_2 (Dense) (None,2) 1026 Total params: 16,788,898 Trainable params: 16,788,898 Non-trainable params: 0 None 2018-10-15 15:31:33.182128: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your cpu supports instructions that this TensorFlow binary was not compiled to use: AVX2 Epoch 1/10 1/1 [] - 2s 2s/step - loss: 1.3793 - accuracy: 0.0000e00 Epoch 2/10 1/1 [] - 0s 0us/step - loss: 1.1117 - accuracy: 1.0000 Epoch 3/10 1/1 [] - 0s 0us/step - loss: 1.0910 - accuracy: 1.0000 Epoch 4/10 1/1 [] - 0s 0us/step - loss: 1.1100 - accuracy: 1.0000 Epoch 5/10 1/1 [] - 0s 0us/step - loss: 1.0100 - accuracy: 1.0000 Epoch 6/10 1/1 [] - 0s 0us/step - loss: 0.9800 - accuracy: 1.0000 Epoch 7/10 1/1 [] - 0s 0us/step - loss: 0.9000 - accuracy: 1.0000 Epoch 8/10 1/1 [] - 0s 0us/step - loss: 0.8500 - accuracy: 1.0000 Epoch 9/10 1/1 [] - 0s 0us/step - loss: 0.7800 - accuracy: 1.0000 Epoch 10/10 1/1 [] - 0s 0us/step - loss: 0.7000 - accuracy: 1.0000 准确率: 100.00% 模型已保存至本地磁盘