Импортировать OpenCV Mat в C ++ Tensorflow без копирования

Моя цель - запустить модель TensorFlow в режиме реального времени, чтобы управлять транспортным средством по изученной модели. Наша система автомобиля использует ROS (Robot Operating System), которая тесно связана с OpenCV. Итак, я получаю мат OpenCV, содержащий интересующее изображение от ROS.

    cv::Mat cameraImg;

Я хотел бы создать Tensorflow Tensor непосредственно из данных в этой матрице OpenCV, чтобы избежать затрат на копирование матрицы построчно. Используя ответ наЭтот вопрос Мне удалось получить прямой проход сети, работающей со следующим кодом:

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();

Однако при использовании этого метода копирование в тензор занимает от 80 мс до 130 мс, в то время как весь прямой проход (для 10-слойной сверточной сети) занимает всего 25 мс.

Смотря натензорная документацияПохоже, что есть конструктор Tensor, который принимает распределитель. Однако я не смог найти какую-либо документацию Tensorflow или Eigen, относящуюся к этой функции илиКласс Eigen Map как это относится к тензорам.

Кто-нибудь знает, как этот код может быть ускорен, в идеале, повторно используя мою память OpenCV?

РЕДАКТИРОВАТЬ: Я успешно реализовал то, что предложил @mrry, и могу повторно использовать память, выделенную OpenCV. я открылGitHub выпуск 8033 запрашивающий это будет добавлен к дереву источника тензорного потока. Мой метод не так хорош, но он работает.

По-прежнему очень сложно скомпилировать внешнюю библиотеку и связать ее с библиотекой libtensorflow.so. Потенциальнобиблиотека тензорного потока cmake поможет с этим, я еще не пробовал.

Ответы на вопрос(2)

Ваш ответ на вопрос