разный результат между Keras Forex и модулем Opencv DNN - PullRequest
0 голосов
/ 16 июня 2020

Я получаю разные результаты с этими двумя фрагментами и не могу понять почему. Я попытался изменить метод интерполяции при загрузке изображения для версии keras, но безуспешно (это должно быть правильно, потому что OpenCV по умолчанию использует билинейный режим для изменения размера). Используемая модель такая же, но была преобразована в caffe, поскольку OpenCV DNN не поддерживает веса H5, преобразование было выполнено с помощью этого инструмента . Результаты кажутся хорошими в обоих случаях (прогнозируемый класс - это проблема классификации), но значения сильно различаются (например, 0,92 Keras против 0,66 OpenCV для высшего класса на изображении). Любая идея ?

Версия Keras :

import argparse
import numpy as np
from keras.preprocessing import image
from keras.models import model_from_json


def load_image(img_path, show=False):

    img = image.load_img(img_path, target_size=(80, 80), interpolation='bilinear')
    img_tensor = image.img_to_array(img)                    
    img_tensor = np.expand_dims(img_tensor, axis=0)        
    img_tensor /= 255.

    return img_tensor


def predict(image):

    # load model
    with open('model.json', 'r') as json_file:
        model = model_from_json(json_file.read())
    model.load_weights('weights20-0.92.h5')
    new_image = load_image(image, True)

    pred = model.predict(new_image)

    print(pred)


def main():
    p = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description="")
    p.add_argument('-image', dest='image', action='store', help='image to predict')

    args = p.parse_args()
    predict(args.image)

Версия OpenCV

import argparse
import cv2
import numpy as np


def predict(image):

    image32 = cv2.imread(image)
    new_image = cv2.dnn.blobFromImage(image32, scalefactor=(1.0/255.0), size=(80, 80), swapRB=True, crop=False)

    model = cv2.dnn.readNet('net.prototxt', 'net.caffemodel')

    model.setInput(new_image)
    pred = model.forward()

    print(pred)


p = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description="")
p.add_argument('-image', dest='image', action='store', help='image to predict')

args = p.parse_args()
predict(args.image)

1 Ответ

0 голосов
/ 17 июня 2020

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

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