web-dev-qa-db-fra.com

Comment passer un mat OpenCV dans un graphe C++ Tensorflow?

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?

15
lefty

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

1
kumar shubham

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));
0
Ivan Talalaev