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]]
这是为批次中的单行生成预测。我已经尝试了 predict
和 predict_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 调整为您计算机的能力。
我正在通过一次调用为视频中的所有关键帧生成 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]]
这是为批次中的单行生成预测。我已经尝试了 predict
和 predict_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 调整为您计算机的能力。