基于 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%
模型已保存至本地磁盘
相关推荐
DreamLife☼1 分钟前
OpenBCI-实时BCI系统:低延迟与闭环控制
人工智能·信息可视化·信号处理·开源硬件·脑机接口·低延迟·openbci
Nile3 分钟前
解密Palantir系列二:4.Palantir Foundry:七问判断该不该上
人工智能·ai·agent·ai编程·ai-native
林间码客3 分钟前
03数据挖掘:分类(Classification)
人工智能·分类·数据挖掘
福老板的生意经3 分钟前
降本增效!全域智能投放方案如何破解营销投放低效难题
大数据·人工智能
俊俊谢4 分钟前
【python】FastAPI 实时推送:从 SSE 到 WebSocket
python·websocket·fastapi
CJH(本人账号)4 分钟前
上线仅72小时被强制下架:Claude Fable 5 的短命
人工智能·安全·语言模型
AI产品库5 分钟前
小米MiMo技术团队正式发布并开源终端原生AI编程助手 MiMo Code,标志着小米首次进入Coding Agent赛道
人工智能·开源·ai编程
城事漫游Molly5 分钟前
“改全文”还是“逐句诊断”?ChatGPT 润色论文的两种用法
人工智能·chatgpt·提示词·ai for science·论文润色·科研论文写作
一头老黄牛@6 分钟前
飞书 × OpenClaw 接入指南:不用服务器,用长连接把机器人跑起来
数据结构·人工智能·程序人生·算法·决策树·自动化·推荐算法
A.说学逗唱的Coke6 分钟前
【大模型专题】AI Copilot 完整实践指南:VSCode + GitHub Copilot Agent 模式全攻略
人工智能·vscode·copilot