Как предварительно обработать входные данные для преобразованной модели keras H5 в файл pb

#python #c #tensorflow #keras #neural-network

#python #c #tensorflow #keras #нейронная сеть

Вопрос:

Я успешно преобразовал модель Keras H5 в файл Tensorflow pb, но я получаю совершенно другой результат при создании прогноза.

В Python я использую 2 модуля Keras для предварительной обработки данных перед подачей в сеть:

 from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
from tensorflow.keras.preprocessing.image import img_to_array
  

Вот как я предварительно обрабатываю данные в своем коде на Python:

 # extract the object ROI, convert it from BGR to RGB channel
# ordering, resize it to 224x224, and preprocess it
moving_object = img_orig[startY:endY, startX:endX]
moving_object = cv2.cvtColor(moving_object, cv2.COLOR_BGR2RGB)
moving_object = cv2.resize(moving_object, (224, 224))
moving_object = img_to_array(moving_object)
moving_object = preprocess_input(moving_object)
    
objects.append(moving_object)
  

Затем я делаю пакетные прогнозы с помощью метода Keras predict:

 # only make a predictions if at least one object was detected
if len(objects) > 0:
objects = np.array(objects, dtype="float32")
preds = wine_plant_model.predict(objects)
  

Вот как я предварительно обрабатываю данные на C :

 vector<Mat> detected_objects;

//extract the object ROI
Mat image_roi = img_orig(roi);

detected_objects.push_back(image_roi);
  

и как я делаю пакетные прогнозы на C :

 if (detected_objects.size() > 0) {

vector<Mat> preds;
    
Mat inputBlobs = cv::dnn::blobFromImages(detected_objects, 1.0, Size(224, 224));
    
net.setInput(inputBlobs);
Mat outputs = net.forward();

} 
  

Кажется, что я неправильно предварительно обрабатываю изображение на C , и поэтому я не получаю одинаковых результатов. Но я не могу найти эквивалент для метода Keras preprocess_input() в C .

Глядя на документацию Keras, метод python preprocess_input() масштабирует данные между 1 и -1. Поэтому я не знаю, следует ли мне нормализовать данные с помощью метода cv::normalize или что-то сделать с масштабным коэффициентом blobFromImages. Я здесь немного запутался.

Не могли бы вы, пожалуйста, сказать мне, что я должен сделать для предварительной обработки данных таким же образом в C , даже если это не через Keras, который, похоже, недоступен в C .

Комментарии:

1. Кажется, все, что он делает в исходном коде, это x /= 127.5 , x -= 1 return x . Настройка scalefactor = 1/127.5 и mean = Scalar(1, 1, 1) в blobFromImages должны работать. Вам также может потребоваться установить соответствующее swapRB значение.

2. Спасибо за ваш ответ и ваше время, я попробую. Что я сделал, так это то, что я предварительно обработал изображение с помощью opencv normalize(image_roi, image_roi, -1, 1, NORM_MINMAX); , чтобы убедиться, что я делаю то же самое, что и метод Keras preprocess_input. И, наконец, я изменил параметры в методе OpenCV blobFromImages: Mat inputBlobs = cv::dnn::blobFromImages(detected_objects, 1.0, Size(224, 224), true);//swapRB true BGR -> RGB Вы согласны с процессом?