#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
Вы согласны с процессом?