Tensorflow 中的单个图像预测不同于 bash 评估
Individual image prediciton in Tensorflow different than batch evaluate
我正在使用 Tensorflow v2.4.1 尝试训练 CNN。这是我训练的(简化)版本:
train_datagen = ImageDataGenerator(
rescale=1./255,
zca_epsilon=1e-06,
rotation_range=20,
width_shift_range=.2,
height_shift_range=.2,
shear_range=0.2,
zoom_range=.2,
fill_mode='nearest',
cval=0., # value used for fill_mode = "constant")
train_generator = train_datagen.flow_from_directory(
data_dir + '/train',
target_size=(256,256),
batch_size=64,
class_mode='categorical'
)
model.fit(train_generator)
现在,我正在尝试编写一些代码,在类似结构的图像目录上逐个测试模型。我这样做是这样的:
class_list = ['a','b','c','d']
count_total = 0
count_right = 0
for c in class_list:
test_dir = data_dir + '/test/', + c + '/'
for imagepath in os.listdir(test_dir):
image = cv2.imread(test_dir+imagepath)
image_from_array = Image.fromarray(image, "RGB")
size_image = image_from_array.resize((256,256))
p = np.expand_dims(size_image, 0)
img = tf.cast(p, tf.float32)/255
pred = class_list[np.argmax(model.predict(img))]
count_total += 1
if pred == c:
count_right += 1
acc = count_right/count_total
我的准确率 (acc
) 结果是 0.20。但是,我认为这是代码的问题,而不是正确的准确性,因为如果我 运行 下面的代码:
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
data_dir + '/test',
target_size=(256,256),
batch_size=64,
class_mode='categorical'
)
model.evaluate(test_generator)
然后 model.evaluate()
报告准确度为 0.53
那么一张一张预测图像的代码有什么问题?
Opencv 默认加载 BGR 图像,而 TensorFlow 使用 RGB。您预测的图像与您用来训练网络的图像明显不同,导致准确性下降。
用opencv加载图像后,你应该将其转换为RGB,或者直接使用pillow来加载RGB图像。
在 opencv 中从 BGR 转换为 RGB:
img_bgr = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
在RGB中直接用Pillow读取图像
img = Image.open("/path/to/the/image")
我正在使用 Tensorflow v2.4.1 尝试训练 CNN。这是我训练的(简化)版本:
train_datagen = ImageDataGenerator(
rescale=1./255,
zca_epsilon=1e-06,
rotation_range=20,
width_shift_range=.2,
height_shift_range=.2,
shear_range=0.2,
zoom_range=.2,
fill_mode='nearest',
cval=0., # value used for fill_mode = "constant")
train_generator = train_datagen.flow_from_directory(
data_dir + '/train',
target_size=(256,256),
batch_size=64,
class_mode='categorical'
)
model.fit(train_generator)
现在,我正在尝试编写一些代码,在类似结构的图像目录上逐个测试模型。我这样做是这样的:
class_list = ['a','b','c','d']
count_total = 0
count_right = 0
for c in class_list:
test_dir = data_dir + '/test/', + c + '/'
for imagepath in os.listdir(test_dir):
image = cv2.imread(test_dir+imagepath)
image_from_array = Image.fromarray(image, "RGB")
size_image = image_from_array.resize((256,256))
p = np.expand_dims(size_image, 0)
img = tf.cast(p, tf.float32)/255
pred = class_list[np.argmax(model.predict(img))]
count_total += 1
if pred == c:
count_right += 1
acc = count_right/count_total
我的准确率 (acc
) 结果是 0.20。但是,我认为这是代码的问题,而不是正确的准确性,因为如果我 运行 下面的代码:
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
data_dir + '/test',
target_size=(256,256),
batch_size=64,
class_mode='categorical'
)
model.evaluate(test_generator)
然后 model.evaluate()
报告准确度为 0.53
那么一张一张预测图像的代码有什么问题?
Opencv 默认加载 BGR 图像,而 TensorFlow 使用 RGB。您预测的图像与您用来训练网络的图像明显不同,导致准确性下降。
用opencv加载图像后,你应该将其转换为RGB,或者直接使用pillow来加载RGB图像。
在 opencv 中从 BGR 转换为 RGB:
img_bgr = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
在RGB中直接用Pillow读取图像
img = Image.open("/path/to/the/image")