Dans Tensorflow C++, je peux charger un fichier image dans le graphique en utilisant
tensorflow::Node* file_reader = tensorflow::ops::ReadFile(tensorflow::ops::Const(IMAGE_FILE_NAME, b.opts()),b.opts().WithName(input_name));
tensorflow::Node* image_reader = tensorflow::ops::DecodePng(file_reader, b.opts().WithAttr("channels", 3).WithName("png_reader"));
tensorflow::Node* float_caster = tensorflow::ops::Cast(image_reader, tensorflow::DT_FLOAT, b.opts().WithName("float_caster"));
tensorflow::Node* dims_expander = tensorflow::ops::ExpandDims(float_caster, tensorflow::ops::Const(0, b.opts()), b.opts());
tensorflow::Node* resized = tensorflow::ops::ResizeBilinear(dims_expander, tensorflow::ops::Const({input_height, input_width},b.opts().WithName("size")),b.opts());
Pour une application intégrée, je voudrais plutôt passer un OpenCV Mat dans ce graphique.
Comment convertir le tapis en un tenseur pouvant être utilisé comme entrée dans tensorflow :: ops :: Cast ou tensorflow :: ops :: ExpandDims?
J'avais essayé de lancer le modèle d'inception sur le fichier opencv Mat
et le code suivant fonctionnait pour moi https://Gist.github.com/kyrs/9adf86366e9e4f04addb . Bien que l'intégration d'opencv et de tensorflow pose problème. Le code a fonctionné sans problème pour les fichiers .png
mais n'a pas pu charger .jpg
et .jpeg
. Vous pouvez suivre cela pour plus d’informations https://github.com/tensorflow/tensorflow/issues/1924
Voici un exemple complet à lire et à alimenter:
Mat image;
image = imread("flowers.jpg", CV_LOAD_IMAGE_COLOR);
cv::resize(image, image, cv::Size(input_height, input_width), 0, 0, CV_INTER_CUBIC);
int depth = 3;
tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT,
tensorflow::TensorShape({1, image.rows, image.cols, depth}));
for (int y = 0; y < image.rows; y++) {
for (int x = 0; x < image.cols; x++) {
Vec3b pixel = image.at<Vec3b>(y, x);
input_tensor_mapped(0, y, x, 0) = pixel.val[2]; //R
input_tensor_mapped(0, y, x, 1) = pixel.val[1]; //G
input_tensor_mapped(0, y, x, 2) = pixel.val[0]; //B
}
}
auto result = Sub(root.WithOpName("subtract_mean"), input_tensor, {input_mean});
ClientSession session(root);
TF_CHECK_OK(session.Run({result}, out_tensors));