基于 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%
模型已保存至本地磁盘
相关推荐
AI绘画哇哒哒19 小时前
Agent三种思考模式深度解析:CoT/ReAct/Plan-and-Execute,小白程序员必看,助你轻松掌握大模型精髓(收藏版)
人工智能·学习·ai·程序员·大模型·产品经理·转行
塔能物联运维19 小时前
存量机房降本增效:两相液冷技术解锁全生命周期成本优化密码
大数据·人工智能
黎阳之光20 小时前
黎阳之光:视频孪生智慧厂网一体化解决方案|污水处理全场景智能化升级
大数据·人工智能·物联网·安全·数字孪生
Omics Pro20 小时前
填补蛋白质组深度学习预处理教学空白
人工智能·python·深度学习·plotly·numpy·pandas·scikit-learn
JavaPub-rodert20 小时前
Codex + cc-switch + GPT-5.5 国内使用教程:从注册 API 到接入 VS Code / Cursor,一篇讲清楚
人工智能·gpt·开源·codex·ccswitch
AI技术控20 小时前
RAG 怎么做 Query 改写?从工程实践看检索增强生成的第一道关键关卡
人工智能·语言模型·自然语言处理·oracle·nlp
解局易否结局20 小时前
ops-transformer 的 FlashAttention:给昇腾NPU 配了个“高效厨房“
人工智能·深度学习·transformer
前端小蜗20 小时前
转生到 AI 时代,我不再相信一键生成代码的传说
前端·人工智能·架构
DS小龙哥20 小时前
基于ESP32+非接触式微波雷达设计的睡眠监控系统
大数据·人工智能
东湖山上20 小时前
GTAC: A Generative Transformer for Approximate Circuits
服务器·人工智能·深度学习·transformer·gpu算力