Importieren Sie OpenCV Mat in C ++ Tensorflow, ohne es zu kopieren

Mein Ziel ist es, ein TensorFlow-Modell in Echtzeit auszuführen, um ein Fahrzeug von einem gelernten Modell aus zu steuern. Unser Fahrzeugsystem verwendet ROS (Robot Operating System), das eng mit OpenCV verbunden ist. Ich erhalte also eine OpenCV-Matte mit dem gewünschten Bild von ROS.

    cv::Mat cameraImg;

Ich möchte einen Tensorflow-Tensor direkt aus den Daten in dieser OpenCV-Matrix erstellen, um das zeilenweise Kopieren der Matrix zu vermeiden. Mit der Antwort aufDiese Frag Ich habe es geschafft, den Weiterleitungspass des Netzwerks mit dem folgenden Code zu erhalten:

cameraImg.convertTo(cameraImg, CV_32FC3);

Tensor inputImg(DT_FLOAT, TensorShape({1,inputheight,inputwidth,3}));
auto inputImageMapped = inputImg.tensor<float, 4>();
auto start = std::chrono::system_clock::now();
//Copy all the data over
for (int y = 0; y < inputheight; ++y) {
    const float* source_row = ((float*)cameraImg.data) + (y * inputwidth * 3);
    for (int x = 0; x < inputwidth; ++x) {
        const float* source_pixel = source_row + (x * 3);
        inputImageMapped(0, y, x, 0) = source_pixel[2];
        inputImageMapped(0, y, x, 1) = source_pixel[1];
        inputImageMapped(0, y, x, 2) = source_pixel[0];
    }
}
auto end = std::chrono::system_clock::now();

Mit dieser Methode dauert das Kopieren zum Tensor jedoch zwischen 80 ms und 130 ms, während der gesamte Vorwärtsdurchlauf (für ein 10-Lagen-Faltungsnetzwerk) nur 25 ms dauert.

Anschauendie tensorflow dokumentation, es scheint, dass es einen Tensor-Konstruktor gibt, der einen Allokator akzeptiert. Ich konnte jedoch keine Tensorflow- oder Eigen-Dokumentation finden, die sich auf diese Funktionalität oder das @ beziehEigen Map class wie es sich auf Tensoren bezieht.

Hat jemand einen Einblick, wie dieser Code beschleunigt werden kann, idealerweise durch Wiederverwendung meines OpenCV-Speichers?

BEARBEITEN Ich habe die Vorschläge von @mrry erfolgreich implementiert und kann den von OpenCV zugewiesenen Speicher wieder verwenden. Ich habe geöffnet Github Ausgabe 8033 um dies anzufordern, wird es dem Tensorflow-Quellbaum hinzugefügt. Meine Methode ist nicht so hübsch, aber sie funktioniert.

s ist immer noch sehr schwierig, eine externe Bibliothek zu kompilieren und mit der Bibliothek libtensorflow.so zu verknüpfen. Möglicherweise dastensorflow cmake library wird dabei helfen, ich habe es noch nicht ausprobiert.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage