В этом руководстве мы используем VGG16 для извлечения функций. Сначала мы импортируем весь необходимый модуль в Jupiter Notebook.
import pandas as pd import numpy as np import keras import matplotlib.pyplot as plt import matplotlib.image as mpimg import h5py import cv2
Также мы импортируем необходимый модуль из Кераса.
from keras.layers import Flatten, Dense, Input,concatenate from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout from keras.models import Model from keras.models import Sequential import tensorflow as tf
Загрузите предварительно обученную модель VGG16.
vgg16 = keras.applications.VGG16(weights=’imagenet’, include_top=True, pooling=’max’, input_shape=(224, 224, 3))
Нам не нужны все слои модели. Извлеките вектор из слоя «fc2» как извлеченный элемент изображения.
basemodel = Model(inputs=vgg16.input, outputs=vgg16.get_layer(‘fc2’).output)
Вы можете увидеть сводку модели, как показано ниже.
Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc1 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc2 (Dense) (None, 4096) 16781312 ================================================================= Total params: 134,260,544 Trainable params: 134,260,544 Non-trainable params: 0
Определите функцию для получения вектора признаков изображения
def get_feature_vector(img): img1 = cv2.resize(img, (224, 224)) feature_vector = basemodel.predict(img1.reshape(1, 224, 224, 3)) return feature_vector
Определите другую функцию для вычисления подобия косинуса.
def calculate_similarity(vector1, vector2): return 1 — spatial.distance.cosine(vector1, vector2)
Таким образом, вы можете сделать это, чтобы вычислить сходство изображения
img1 = read_image("./img1.jpg") img2 = read_image("./img2.jpg") img3 = read_image("./img3.jpg") f1 = get_feature_vector(img1) f2 = get_feature_vector(img2) f3 = get_feature_vector(img3) calculate_feature_vectors_dist(f1, f2) # 0.7384121417999268 calculate_feature_vectors_dist(f1, f3) # 0.48573723435401917