В настоящее время я пишу плагин Gstreamer1.0, который будет перехватывать фрейм, использовать тензорный поток для выполнения некоторой задачи, записывать данные в фрейм и вставлять их обратно.
Я делаю это в C / C ++, и в настоящее время я сталкиваюсь с проблемой, когда данные должны передаваться между Gstreamer и Tensorflow.
У меня есть кадр в объекте GstBuffer, из которого я должен извлечь данные и построить входной тензор.
Формат всегда один и тот же, матрица UINT8 RGB [ширина, высота, 3]
/* extract raw data from gstreamer buffer */
gpointer bytes;
gst_buffer_extract_dup(outbuf, 0, size, &bytes, &copied);
С указателем байтов теперь я должен построить:
Tensor input(tensorflow::DT_UINT8, tensorflow::TensorShape(cwidth, cheight, 3));
Я понятия не имею, как я должен это сделать.
Я не мог найти какую-либо информацию или пример о том, как я могу работать с gpointer, и о тензорном потоке, я мог только найти примеры, использующие файл в качестве источника, который совсем не мой случай.
Любые выводы или понимание будет принята с благодарностью.
Я нашел способ, но он работает только тогда, когда ваш буфер является RGB, 3-канальный кадровый буфер.
Tensor ConvertRGBBufferToInputTensor(gpointer buffer, gint cwidth, gint cheight, gint channel) {
Tensor input_tensor(tensorflow::DT_UINT8, tensorflow::TensorShape({1, cwidth, cheight, channel}));
auto input_tensor_mapped = input_tensor.tensor<uint8_t, 4>();
uint8_t * uintdata = (uint8_t*)buffer;
for (int y = 0; y < cheight; ++y) {
const uint8_t* source_row = uintdata + (y * cwidth * channel);
for (int x = 0; x < cwidth; ++x) {
const uint8_t* source_pixel = source_row + (x * channel);
for (int c = 0; c < channel; ++c) {
const uint8_t* source_value = source_pixel + c;
input_tensor_mapped(0, y, x, c) = *source_value;
}
}
}
return input_tensor;
}
И использовать его из gstreamer, когда у вас есть GstBuffer
/* extract raw data from the buffer and convert it to an input tensor */
gst_buffer_extract_dup(outbuf, 0, size, &bytes, &copied);
GST_INFO("Extracted %" G_GSIZE_FORMAT " from buffer" , copied);
Tensor input_tensor = ConvertRGBBufferToInputTensor(bytes, cwidth, cheight);
g_free(bytes);
Других решений пока нет …