Импортировать 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 поможет с этим, я еще не пробовал.