Можем ли мы изменить размер изображения с 64x64 до 256x256 без увеличения размера - PullRequest
0 голосов
/ 03 июня 2019

Можем ли мы изменить размер изображения с 64x64 до 256x256 без увеличения размера и повлиять на разрешение, если добавить ноль к новой строке и столбцу в новом выходе с измененным размером. Я работаю с vgg и получаю ошибку при добавлении моего Входное изображение 64x64, потому что vggface - модель с переобучением, включающая входной размер 224

код:

from keras.models import Model, Sequential
from keras.layers import Input, Convolution2D, ZeroPadding2D, MaxPooling2D, Flatten, Dense, Dropout, Activation
from PIL import Image
import numpy as np
from keras.preprocessing.image import load_img, save_img, img_to_array
from keras.applications.imagenet_utils import preprocess_input
from keras.preprocessing import image
import matplotlib

matplotlib.use('TkAgg')

import matplotlib.pyplot as plt

# from sup5 import X_test, Y_test
from sklearn.metrics import roc_curve, auc


from keras.models import Model, Sequential
from keras.layers import Input, Convolution2D, ZeroPadding2D, MaxPooling2D, Flatten, Dense, Dropout, Activation
from PIL import Image
import numpy as np
from keras.preprocessing.image import load_img, save_img, img_to_array
from keras.applications.imagenet_utils import preprocess_input
from keras.preprocessing import image
import matplotlib.pyplot as plt

# from sup5 import X_test, Y_test
from sklearn.metrics import roc_curve, auc
from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np

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




from keras.models import model_from_json




vgg_face_descriptor = Model(inputs=model.layers[0].input
                            , outputs=model.layers[-2].output)
# import  pandas as pd
# test_x_predictions = deep.predict(X_test)
# mse = np.mean(np.power(X_test - test_x_predictions, 2), axis=1)
# error_df = pd.DataFrame({'Reconstruction_error': mse,
#                         'True_class': Y_test})
# error_df.describe()
from PIL import Image


def preprocess_image(image_path):
    img = load_img(image_path, target_size=(224, 224))

    img = img_to_array(img)
    img = np.expand_dims(img, axis=0)

    img = preprocess_input(img)
    return img


def findCosineSimilarity(source_representation, test_representation):
    a = np.matmul(np.transpose(source_representation), test_representation)
    b = np.sum(np.multiply(source_representation, source_representation))
    c = np.sum(np.multiply(test_representation, test_representation))
    return 1 - (a / (np.sqrt(b) * np.sqrt(c)))


def findEuclideanDistance(source_representation, test_representation):
    euclidean_distance = source_representation - test_representation
    euclidean_distance = np.sum(np.multiply(euclidean_distance, euclidean_distance))
    euclidean_distance = np.sqrt(euclidean_distance)
    return euclidean_distance


vgg_face_descriptor = Model(inputs=model.layers[0].input, outputs=model.layers[-2].output)

# for encod epsilon = 0.004
epsilon = 0.16
# epsilon = 0.095
retFalse,ret_val, euclidean_distance = verifyFace(str(i)+"test.jpg", str(j)+"train.jpg", epsilon)
  verifyFace1(str(i) + "testencod.jpg", str(j) + "trainencod.jpg")

Ошибка: ValueError: операнды не могут быть переданы вместе с переназначенные формы [original-> remapped]: (512,14,14) -> (512, Newaxis, Newaxis) (14,14,512) -> (14, Newaxis, Newaxis) и запрашиваемая форма (14 512)

Ответы [ 3 ]

2 голосов
/ 03 июня 2019

Я не уверен, что вы имеете в виду, вот мое решение для вас.Первый способ, если я четко понимаю, что вы имеете в виду, для добавления пэда с нулевым значением вам нужно использовать numpy.pad для каждого слоя изображения.

I use this image for take example, its shape is 158x84x3

Я использую это изображение для примера, его форма составляет 158x84x3

import numpy as np
import cv2
from matplotlib import pyplot as mlt
image = cv2.imread('zero.png')
shape = image.shape
add_x = int((256-shape[0])/2)
add_y = int((256-shape[1])/2)
temp_img = np.zeros((256,256,3),dtype = int)
for i in range(3):
    temp_img[:,:,i] = np.pad(image[:,:,i],((add_x,add_x),(add_y,add_y)),'constant', constant_values = (0))
mlt.imshow(temp_img)

С помощью этого кода я могу добавить отступы на изображение и получить такой результат.

enter image description here

Теперь его форма 256x256x3, как вы хотите.Или другой способ для вас - использовать библиотеку Image of Pillow.Используя это, вы можете изменить размер изображения, не теряя слишком много информации с очень простым кодом.

from PIL import Image
image = Image.fromarray(image)
img = image.resize((256, 256), Image.BILINEAR) 
mlt.imshow(img)

Этот код даст вам это решение

enter image description here

Надеюсь, мой ответ поможет вам решить проблему!

0 голосов
/ 03 июня 2019

Я думаю, что лучший способ решить вашу проблему - это не изменить размер изображения, а загрузить модель, указав форму ввода ваших изображений.Предполагая, что вы используете keras:

model = VGG16(weights=..., include_top=False, input_shape=(64,64,3))

Параметр Include top должен иметь значение false, чтобы изменить форму ввода, а это значит, что вам нужно будет провести какое-то обучение самостоятельно.Если вам нужно, чтобы значение include_top было True, изменение размера входного изображения - лучший способ продолжить работу, но сеть, обученная на изображениях 224x224, вероятно, не будет работать хорошо с масштабированными изображениями 64x64.

0 голосов
/ 03 июня 2019

Я думаю, что вы имеете в виду изменение размера (разрешения) без увеличения размера (объема данных), и, насколько я знаю, ответ будет отрицательным, поскольку увеличение разрешения в буквальном смысле означает увеличение числа пикселей.Вы можете изменить разрешение без чрезмерного увеличения размера файла, хотя существует множество программ, веб-сайтов и утилит для облегчения изменения размера фотографий, может быть, вы могли бы внедрить использование подобного сервиса в свой код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...