Keras 从不同图像中提取相同特征

Keras Same Feature Extraction from Different Images

我正在使用 Keras 的预训练模型对两幅图像进行特征提取,但是它们给出了相同的结果 (array_equal = True)。我尝试过 VGG16 和 Resnet50 等其他模型,但结果是一样的。是我写错了代码还是预训练模型的限制?我能做些什么来提取不同的特征吗?谢谢!

import cv2
from keras.applications.inception_v3 import InceptionV3
from keras.applications.inception_v3 import preprocess_input

model = InceptionV3(weights='imagenet', include_top=False)

def get_img_vector(path):

    im = cv2.imread(path)
    im = cv2.resize(im,(224,224))
    img = preprocess_input(np.expand_dims(im.copy(), axis=0))
    resnet_feature = model.predict(img)

    return np.array(resnet_feature)

arr1 = get_img_vector('image1.png')
arr2 = get_img_vector('image2.png')

np.array_equal(arr1,arr2)

下面是我的两张图:

如果你 运行 代码,你应该会看到这样的警告,

 WARNING: TensorFlow:Model was constructed with shape (None, 299, 299, 3)
 for input Tensor("input_3:0", shape=(None, 299, 299, 3), dtype=float32),
 but it was called on an input with incompatible shape (None, 224, 224, 3).

将您的代码更改为

im = cv2.resize(im,(299,299))

现在关于相似的特征,预训练的imagenet可以分类1000 类和给定的图片。如果你解码那么你会看到它们都会给你相同的输出。你会看到即使是前 5 个预测,置信度也很低,最相似的是线虫的图像。

[[('n01930112', 'nematode', 0.11086103), ('n03729826', 'matchstick', 0.08173305), ('n03196217', 'digital_clock', 0.034744), ('n03590841', "jack-o'-lantern", 0.017616412), ('n04286575', 'spotlight', 0.016781498)]]

但是,如果您想训练一个可以区分这两张图像的模型,那么您可以使用预训练模型对您自己的数据集进行迁移学习。

我认为文件格式 png 造成了图像加载问题。目前 cv2.imread 一个 png 文件和 cv2.imshow 它导致黑屏,这使得两个图像相同。将文件从 png 保存为 jpg 并重试。