Keras/Tensorflow - 为 imagenet 批量生成预测(我只得到一个结果)

Keras/Tensorflow - Generate predictions in batch for imagenet (I get only one result back)

我正在通过一次调用为视频中的所有关键帧生成 imagenet 标签,并且有以下代码:

 # all keras/tf/mobilenet imports
model_imagenet = MobileNetV2(weights='imagenet')

frames_list = []
for frame in frame_set:
    frame_img = frame.to_image()
    frame_pil = frame_img.resize((224,224), Image.ANTIALIAS)
    ts = int(frame.pts)
    x = image.img_to_array(frame_pil)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    frames_list.append(x)

print(len(frames_list))                

preds_list = model_imagenet.predict_on_batch(frames_list)
print("[*]",preds_list)

结果是这样的:

frames_list count: 125

因此预测,一行 1000 维 (imagenet 类),不应该是 125 行吗?:

[[1.15425530e-04 1.83317825e-04 4.28701424e-05 2.87547664e-05
                    :
  7.91769926e-05 1.30803732e-04 4.81895368e-05 3.06891889e-04]]

这是为批次中的单行生成预测。我已经尝试了 predictpredict_on_batch,结果相同。

如何使用 Keras/Tensorflow/Mobilenet 一次获得 200 帧的批量预测?

ImageNet 是一个流行的数据库,它包含 1000 个不同的类别。

1000 的维度是自然的并且在意料之中,因为对于一个图像,softmax 输出 1000 个中的每一个的概率 类。

编辑:对于多个图像预测,您应该使用predict_generator()。此外,从 TensorFlow 2.0 开始,如果您使用 Keras 后端,predict_generator() 已被弃用,取而代之的是简单的 predict,它也允许输入数据作为生成器。

例如: (来自 ) :

test_datagen = ImageDataGenerator(rescale=1./255)
#Modify the batch size here
test_generator = test_datagen.flow_from_directory(
        test_dir,
        target_size=(200, 200),
        color_mode="rgb",
        shuffle = False,
        class_mode='categorical',
        batch_size=1)

filenames = test_generator.filenames
nb_samples = len(filenames)

predict = model.predict_generator(test_generator,steps = nb_samples)

请记住,一次有很多预测的可能性很小,因为它受限于视频卡的内存。

此外,请注意 predict 和 predict_on_batch 之间的区别:

好的,我是这样解决的,希望这对其他人有帮助:

preds_list = model_imagenet.predict(np.vstack(frames_list),batch_size=32)
print("[*]",preds_list)

请注意 np.vstack 并将 batch_size 调整为您计算机的能力。