tensorflow进行图片分类参考代码

⌚Time: 2023-11-22 02:20:00

👨‍💻Author: Jack Ge

本人在学习TensorFlow机器学习的时候使用的例子和程序。主要是使用tf2.6版本


下面是一个基于TensorFlow 2.6的用于对10类照片进行分类的示例代码,使用的是卷积神经网络(CNN)模型。CIFAR-10分类的经典架构 - 这是处理CIFAR-10数据集的常见CNN架构

import tensorflow as tf
from tensorflow import keras

# 定义模型结构
model = keras.Sequential([
    keras.layers.Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=(64, 64, 3)),
    keras.layers.MaxPooling2D(pool_size=(2, 2)),
    keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu'),
    keras.layers.MaxPooling2D(pool_size=(2, 2)),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 加载数据集
(train_images, train_labels), (test_images, test_labels) = keras.datasets.cifar10.load_data()

# 数据预处理
train_images = train_images.astype('float32') / 255.0
test_images = test_images.astype('float32') / 255.0

# 训练模型
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))

# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print("Test accuracy:", test_acc)

这个示例代码中,使用了两个卷积层和一个全连接层的结构,其中使用了ReLU激活函数和dropout技术进行过拟合的防治。在训练模型时,使用了CIFAR-10数据集进行训练和验证,并且对数据进行了归一化处理。最后,使用测试数据集对模型进行了评估,并输出了模型的测试准确率。


tensorflow图片分类训练

import tensorflow as tf
import os
import numpy as np
#获取图片,存放到对应的列表中,同时贴上标签,存放到label列表中
def get_files(file_dir):
    # 存放图片类别和标签的列表:第0类
    list_0 = []
    label_0 = []
    # 存放图片类别和标签的列表:第1类
    list_1 = []
    label_1 = []
    # 存放图片类别和标签的列表:第2类
    list_2 = []
    label_2 = []
    # 存放图片类别和标签的列表:第3类
    list_3 = []
    label_3 = []
    # 存放图片类别和标签的列表:第4类
    list_4 = []
    label_4 = []


    for file in os.listdir(file_dir):
        #print(file)
        #拼接出图片文件路径
        image_file_path = os.path.join(file_dir,file)
        for image_name in os.listdir(image_file_path):
            # print('image_name',image_name)
            #图片的完整路径
            image_name_path = os.path.join(image_file_path,image_name)
            # print('image_name_path',image_name_path)
            #将图片存放入对应的列表
            if image_file_path[-1:] == '狮子':
                list_0.append(image_name_path)
                label_0.append(0)
            elif image_file_path[-1:] == '大象': 
                list_1.append(image_name_path)
                label_1.append(1)
            elif image_file_path[-1:] == '猫':
                list_2.append(image_name_path)
                label_2.append(2)
            elif image_file_path[-1:] == '狗':
                list_3.append(image_name_path)
                label_3.append(3)
            elif image_file_path[-1:] == '蛇':
                list_4.append(image_name_path)
                label_4.append(4)

    # 合并数据
    image_list = np.hstack((list_0, list_1, list_2, list_3, list_4))
    label_list = np.hstack((label_0, label_1, label_2, label_3, label_4))
    #利用shuffle打乱数据
    temp = np.array([image_list, label_list])
    temp = temp.transpose()  # 转置
    np.random.shuffle(temp)
    
    #将所有的image和label转换成list
    image_list = list(temp[:, 0])
    image_list = [i for i in image_list]
    label_list = list(temp[:, 1])
    label_list = [int(float(i)) for i in label_list]
    #print(image_list)
    #print(label_list)
    return image_list, label_list
image_list, label_list = get_files('D:\\机器学习\\动物分类数据集\\动物分类')
train_image = []
for imagePath in image_list:
    image = tf.io.read_file(imagePath )  # 读取图片
    image = tf.image.decode_jpeg(image, channels=3)
    image = tf.image.resize(image, [60, 60])
    image /= 255.0# 归一化到[0,1]范围
    train_image.append(image)
train_images = np.array(train_image)
train_labels = np.array(label_list)

#训练
from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential(
[
    # 第一层CNN
    tf.keras.layers.Conv2D(16, (3,3), activation='relu',input_shape=[60, 60, 3]),
    tf.keras.layers.MaxPooling2D(2, 2),
    # 第二层CNN
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    # 第三层CNN
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(5, activation='softmax')#输出5个神经元,激活方式softmax
])

model.compile(optimizer='adam',
             loss='sparse_categorical_crossentropy',
             metrics=['accuracy'])
model.fit(train_images, train_labels,epochs=50,steps_per_epoch=5)



# 保存模型
model_save_path = "D:\\机器学习\\代码\\tensorflow2.6\\animal.h5"
model.save(model_save_path)
# 删除当前已存在的模型
del model

预测

import tensorflow as tf
import numpy as np

image = tf.io.read_file('D:/机器学习/动物分类数据集/测试/s0.jpg')# 读取图片
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, [60, 60])
image /= 255.0  # 归一化到[0,1]范围
it = np.array(list(image))
itt = it.reshape(1,60,60,3)
# 加载模型
from keras.models import load_model
model = load_model("D:\\机器学习\\代码\\tensorflow2.6\\animal.h5")

# 对图像做预测
y = model.predict(itt)
print('狮子')
print(y[0][0])
print('大象')
print(y[0][1])
print('猫')
print(y[0][2])
print('狗')
print(y[0][3])
print('蛇')
print(y[0][4])

tensorflow训练是人是马

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 1-1、创建两个数据生成器
train_data_gen = ImageDataGenerator(rescale=1/255)
test_data_gen = ImageDataGenerator(rescale=1/255)

# 训练数据生成器(指向训练数据文件夹)
train_generator = train_data_gen.flow_from_directory(
    'D:\\python\\horse-or-human',
    target_size = (150,150), batch_size = 32, class_mode = 'binary'
#   目标大小                  一批的数量         二分类
)

test_generator = test_data_gen.flow_from_directory(
    'D:\\python\\validation-horse-or-human',
    target_size = (150,150), batch_size = 32, class_mode = 'binary'
)
# 2、构建神经网络
import tensorflow as tf
from tensorflow.keras.optimizers import RMSprop
 
# 神经网络模型
model = tf.keras.models.Sequential([
    # 第一层CNN
    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    # 第二层CNN
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    # 第三层CNN
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    # 第四层CNN
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    # 第五层CNN
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    
    # 输入层
    tf.keras.layers.Flatten(),
    # 隐层
    tf.keras.layers.Dense(512, activation='relu'),
    # 输出层:用sigmoid激活函数二分类(只有一个神经元,结果只有0和1,分别对应人和马)
    tf.keras.layers.Dense(1, activation='sigmoid')
])
# 可视化
model.summary()

model.compile(loss='binary_crossentropy', optimizer=RMSprop(learning_rate=0.001), metrics=['acc'])
#model.fit(train_generator, epochs=3, validation_data=test_generator)
model.fit(train_generator, epochs=3)

import cv2
import matplotlib.pyplot as plt
import numpy as np
 
# (1) 读取图像
# img1:马    img2:人
img1 = cv2.imread('D:/python/validation-horse-or-human/horses/horse1-000.png')
img1 = cv2.resize(img1, (150, 150))
img2 = cv2.imread('D:/python/validation-horse-or-human/humans/valhuman01-01.png')
img2 = cv2.resize(img2, (150, 150))
 
# (2) BGR转RGB
# OpenCV中图片像素按照BGR方式排列;而Matpoltlib中图片按照RGB方式排序
b,g,r = cv2.split(img1)    #分离
img1 = cv2.merge([r,g,b])  #合并
b,g,r = cv2.split(img2)    #分离
img2 = cv2.merge([r,g,b])  #合并
 
# (3) 显示图像
f, ax = plt.subplots(1, 2)
ax[0].imshow(img1)
ax[1].imshow(img2)
plt.show()
 
# 图像转数据(用来做预测)
Img1 = np.expand_dims(img1, axis=0)    #转三维数据(二维转三维)
Img2 = np.expand_dims(img2, axis=0)    #转三维数据(二维转三维)
 
 
# 4、预测(分别对两个图进行预测)
# 对图像1做预测
y = model.predict(Img1, batch_size=10)
print(y[0][0])
# 对图像2做预测
y = model.predict(Img2, batch_size=10)
print(y[0][0])



model_save_path = "D:\\python3.6库\\model_file_path.h5"
# 保存模型
model.save(model_save_path)
# 删除当前已存在的模型
del model

预测人马

import numpy as np
 
# (1) 读取图像
from keras.preprocessing import image
img = image.load_img("D:\\python\\validation-horse-or-human\\horses\\horse1-204.png", target_size=(150, 150))
img1 = image.img_to_array(img)
img = image.load_img("D:\\python\\validation-horse-or-human\\humans\\valhuman01-14.png", target_size=(150, 150))
img2 = image.img_to_array(img)
 
# 图像转数据(用来做预测)
Img1 = np.expand_dims(img1, axis=0)    #转三维数据(二维转三维)
Img2 = np.expand_dims(img2, axis=0)    #转三维数据(二维转三维)
 


# 加载模型
from keras.models import load_model
model = load_model("D:\\python3.6库\\model_file_path.h5")

# 对图像1做预测
y = model.predict(Img1, batch_size=10)
print(y[0][0])
# 对图像2做预测
y = model.predict(Img2, batch_size=10)
print(y[0][0])