CNN输入图片进行预测TF2版本

一、直接上全码 已注解

import tensorflow as tf
import numpy as np
from PIL import image
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras import Model
# 断点续训存储路径
model_save_path = './checkpoint/Baseline.ckpt'


# 加载网络模型
class Baseline(Model):
    def __init__(self):
        super(Baseline, self).__init__()
        # 卷积层 6个卷积核 每个卷积核5*5*3尺寸 输入图像特征为三通道 卷积核默认深度为3,步长默认1,全零填充
        self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding='same')
        self.b1 = BatchNormalization()  # BN层 每个卷积核包含可更新的参数γ和β 放入卷积层和激活层中间 LeNet时代还没有批归一化
        self.a1 = Activation('relu')  # 激活层 LeNet时代一般使用sigmoid激活函数
        self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding='same')  # 池化层 最大池化 池化核2*2尺寸,步长为2,全零填充
        self.d1 = Dropout(0.2)  # dropout层 随机休眠百分之二十的神经元

        self.flatten = Flatten()  # 拉直输入特征
        self.f1 = Dense(128, activation='relu')  # 128个神经元的FNN
        self.d2 = Dropout(0.2)
        self.f2 = Dense(10, activation='softmax')

    def call(self, x):
        x = self.c1(x)
        x = self.b1(x)
        x = self.a1(x)
        x = self.p1(x)
        x = self.d1(x)

        x = self.flatten(x)
        x = self.f1(x)
        x = self.d2(x)
        y = self.f2(x)
        return y


model = Baseline()
# 使用断点参数
model.load_weights(model_save_path)
# 利用已经训练好的网络模型

# cafir10数据集 32*32大小 3通道 即:32*32*3 输入特征需要batch*32*32*3
# 将图片加载为指定像素
test_image = image.load_img('马.jpg', target_size=(32, 32))
# 转换成array格式 32*32*3
test_image = image.img_to_array(test_image)
# 将3维array格式数据增加一维变成4维 与所需要输入一致
test_image = np.expand_dims(test_image, axis=0)
# 输入图片进行预测
prediction = model.predict(test_image)
#预测结果为独热码,符合概率分布,因此 选出最大概率
pred = tf.argmax(prediction, axis=1)
tf.print("预测类别为", pred)


二、知乎大神输入n张图片,进行批量预测

file_path = 'D:/Data/dogs/'
f_names = glob.glob(file_path + '*.jpg')

imgs = []
for i in range(len(f_names)):  # f_names为所有图片地址,list
    img = image.load_img(f_names[i], target_size=(224, 224))  # 读取图片
    arr_img = image.img_to_array(img)  # 图片转换为数组
    arr_img = np.expand_dims(arr_img, axis=0)   # 增加第一个batch维度
    imgs.append(arr_img) # 把图片数组加到一个列表里面
    print("loading no.%s image."%i)
x = np.concatenate([x for x in imgs]) # 把所有图片数组concatenate在一起

print("predicting...")
model = ResNet50(weights='imagenet')
y = model.predict(x)
print("Completed!")
这里使用了concatenate方法将所有1*224*224*3的图片连接成了all*224*224*3

在此附上知乎原文连接

三、在此附上py数据集存储为图片的代码

供自己复习

在这里插入图片描述

import numpy as np
import pickle
import imageio
# 解压缩,返回解压后的字典


def unpickle(file):
    fo = open(file, 'rb')
    dict = pickle.load(fo, encoding='latin1')
    fo.close()
    return dict


# 生成训练集图片,如果需要png格式,只需要改图片后缀名即可。
for j in range(1, 6):
    dataName = "data_batch_" + str(j)  # 读取当前目录下的data_batch12345文件,dataName其实也是data_batch文件的路径,本文和脚本文件在同一目录下。
    Xtr = unpickle(dataName)
    print(dataName + " is loading...")

    for i in range(0, 10000):
        img = np.reshape(Xtr['data'][i], (3, 32, 32))  # Xtr['data']为图片二进制数据
        img = img.transpose(1, 2, 0)  # 读取image
        picName = 'train/' + str(Xtr['labels'][i]) + '_' + str(i + (j - 1)*10000) + '.jpg'  # Xtr['labels']为图片的标签,值范围0-9,本文中,train文件夹需要存在,并与脚本文件在同一目录下。
        imageio.imwrite(picName, img)
    print(dataName + " loaded.")

print("test_batch is loading...")

# 生成测试集图片
testXtr = unpickle("test_batch")
for i in range(0, 10000):
    img = np.reshape(testXtr['data'][i], (3, 32, 32))
    img = img.transpose(1, 2, 0)
    picName = 'test/' + str(testXtr['labels'][i]) + '_' + str(i) + '.jpg'
    imageio.imwrite(picName, img)
print("test_batch loaded.")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

plus_left

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值