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")