基于 TensorFlow 的图像识别

摘要:本文介绍了基于TensorFlow框架构建图像识别系统的实现方法。系统通过卷积神经网络(CNN)模型对64×64像素图像进行分类识别,包含数据加载、模型训练和预测三个核心模块。实验采用自定义数据集,构建了包含卷积层、池化层和全连接层的深度学习模型,使用SGD优化器和交叉熵损失函数进行训练,最终达到100%的准确率。模型结构和权重分别保存为JSON和H5格式,便于后续部署应用。该系统可扩展应用于安防等实际场景中的图像识别任务。

目录

[基于 TensorFlow 的图像识别](#基于 TensorFlow 的图像识别)

图像加载代码(load_data.py)

图像训练代码(train.py)


基于 TensorFlow 的图像识别

TensorFlow 内置了专门的图像识别功能,待识别的图像需存储在指定文件夹中。对于特征相似度较高的图像,借助该功能可轻松实现安防场景下的图像识别逻辑。

本文实现图像识别代码的文件夹结构如下:此电脑 > 本地磁盘 (E:) > Tensorflow-image-recognition

名称 修改日期 类型 大小
.idea 2018/9/3 21:01 文件夹 -
pycache 2018/9/3 20:48 文件夹 -
dataset_image 2018/10/15 15:29 文件夹 -
logs 2018/10/15 15:31 文件夹 -
int_to_word_out.pickle 2018/10/15 15:31 PICKLE 文件 1KB
load_data.py 2018/9/3 20:41 PY 文件 1KB
model_face.h5 2018/10/15 15:31 H5 文件 65604KB
model_face.json 2018/10/15 15:31 JSON 文件 3KB
predict.py 2018/9/3 20:41 PY 文件 1KB
README.md 2018/9/3 20:41 MD 文件 2KB
train.py 2018/9/3 20:41 PY 文件 3KB

dataset_image文件夹中存放了需要加载的待识别相关图像,本文的图像识别将以该文件夹中自定义的标识图像为识别对象。图像通过load_data.py脚本加载,该脚本可辅助记录其中各类图像识别模块的相关信息。

图像加载代码(load_data.py)

python 复制代码
import 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.py

python 复制代码
import 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), padding='same',
   activation='relu', kernel_constraint=maxnorm(3)))
# 添加Dropout层,随机丢弃20%的神经元
model.add(Dropout(0.2))
# 再次添加卷积层
model.add(Conv2D(32, (3,3), activation='relu', padding='same',
   kernel_constraint=maxnorm(3)))
# 添加最大池化层,池化窗口2×2
model.add(MaxPooling2D(pool_size=(2,2)))
# 展平层,将多维特征映射转为一维
model.add(Flatten())
# 全连接层:512个神经元,ReLU激活
model.add(Dense(512, activation='relu', kernel_constraint=maxnorm(3)))
# Dropout层,随机丢弃50%的神经元
model.add(Dropout(0.5))
# 输出层:分类数对应神经元数,softmax激活输出分类概率
model.add(Dense(num_classes, activation='softmax'))

# 编译模型
epochs = 10  # 训练轮数
lrate = 0.01 # 学习率
decay = lrate/epochs # 学习率衰减
# 定义随机梯度下降优化器
sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)
# 损失函数为交叉熵,优化器为SGD,评估指标为准确率
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
# 打印模型结构摘要
print(model.summary())

# 定义回调函数:TensorBoard可视化,日志保存至logs文件夹
callbacks = [keras.callbacks.TensorBoard(log_dir='./logs',
   histogram_freq=0, batch_size=32, write_graph=True, write_grads=False,
   write_images=True, embeddings_freq=0, embeddings_layer_names=None,
   embeddings_metadata=None)]

# 训练模型
model.fit(X_train, y_train, epochs=epochs,
   batch_size=32, shuffle=True, callbacks=callbacks)

# 模型评估
scores = model.evaluate(X_train, y_train, verbose=0)
# 打印识别准确率
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("模型已保存至本地磁盘")

上述代码运行后,输出结果如下:

plaintext

复制代码
Layer (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.0000e+00
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%
模型已保存至本地磁盘
相关推荐
Dev7z1 小时前
基于深度学习的违章停车检测系统的设计与实现
人工智能·深度学习·违章停车·人行道违停·禁停区违停·双排停车·斑马线违停
发哥来了1 小时前
主流GEO优化系统技术对比评测
人工智能·信息可视化
儒雅芝士1 小时前
RethinkFun深度学习笔记
人工智能·笔记·深度学习
xiaoginshuo1 小时前
流程自动化从传统RPA升级到AI Agent,如何匹配合适的自动化方案
人工智能·自动化·rpa
这张生成的图像能检测吗1 小时前
(论文速读)XLNet:语言理解的广义自回归预训练
人工智能·计算机视觉·nlp·注意力机制
新缸中之脑1 小时前
Ollama视觉模型实测
人工智能
悠闲蜗牛�1 小时前
边缘AI推理实战:从服务器到嵌入式设备的模型部署与优化
运维·服务器·人工智能
小鸡吃米…1 小时前
TensorFlow - 构建计算图
人工智能·python·tensorflow
shuidaoyuxing2 小时前
机器人具身智能概念
人工智能·机器人