基于 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%
模型已保存至本地磁盘
相关推荐
爱码小白几秒前
MySQL 单表查询练习题汇总
数据库·python·算法
数据堂官方账号2 分钟前
数据竞赛 | 第二届多语种对话语音语言模型(MLC-SLM)挑战赛正式开启
人工智能·语言模型·自然语言处理·语音语言模型
Agent产品评测局7 分钟前
企业数据处理自动化落地,抓取分析全流程实现方案 —— 2026企业级智能体选型与技术路径深度解析
运维·人工智能·ai·自动化
北辰alk12 分钟前
全网最详实!Python 全家桶框架深度对比:从 Web 开发到 AI 应用,一篇打通选型关
python
大强同学17 分钟前
对比 VS Code:Zed 编辑器编码体验全面解析
人工智能·windows·编辑器·ai编程
豆沙糕26 分钟前
RAG文档切分最佳实践:企业级方案+主流策略+生产落地
数据库·人工智能
minglie127 分钟前
zynq环境用opencv测摄像头
人工智能·opencv·计算机视觉
xyz_CDragon38 分钟前
OpenClaw Skills 完全指南:ClawHub 安装、安全避坑与自定义开发(2026)
人工智能·python·ai·skill·openclaw·clawhub
断眉的派大星39 分钟前
pytorch中view和reshape的区别
人工智能·pytorch·python
nihao56142 分钟前
机器学习:阈值与混淆矩阵
人工智能·机器学习·矩阵