Для обнаружения объектов в видео мы используем пакеты с размером больше 1. Но в конце видео, когда осталось меньше кадров, чем размер пакета, мы получаем эту ошибку:
2018-06-07 15:31:26.456907: W tensorflow/core/framework/op_kernel.cc:1290] CtxFailure at image_resizer_state.h:84: Invalid argument: output dimensions must be positive
Для чтения видео мы используем Opencv 3.3.0, кадры хранятся в векторе batch
for (size_t i = 0; i < batch_size; i++) {
ret = cap.read(readImage);
if (!ret) {
break;
}
batch.push_back(readImage.clone());
}
Этот вектор преобразуется в Tf Тензор как
tensorflow::Tensor inputImg(
tensorflow::DT_UINT8,
tensorflow::TensorShape(
{static_cast<long long int>(batch.size()), height, width, depth}));
for (size_t i = 0; i < batch.size(); i++) {
auto tmp = inputImg.Slice(i, i + 1);
uint8_t *p = tmp.flat<uint8_t>().data();
cv::Mat cameraImg(height, width, CV_8UC3, p);
batch[i].convertTo(cameraImg, CV_8UC3);
}
Вы можете заметить, что Tensor инициализируется с размером фактического пакета, поэтому он содержит определенное количество изображений в начале и меньше изображений в конце видео.
После этого запускаем «детектор»
std::vector<tensorflow::Tensor> output_tensors;
tensorflow::Status status =
session->Run({{"image_tensor:0", inputImg}}, {"detection_boxes:0", "detection_scores:0",
"detection_classes:0", "num_detections:0"}, {}, &output_tensors);
Который заканчивается ошибкой (status.ok() == False
и упомянутое сообщение появляется).
Так что в течение всего видео у нас нет ошибок, но когда, например, осталось только 2 изображения (так, вектор batch
имеет размер 2), но предыдущий размер партии был 5, у нас есть ошибка и output_tensors
имеет размер 0. Мы пытались запускать наш детектор со случайно изменяющимся размером пакета для каждой итерации, и не было ошибки, когда текущий пакет имел размер, отличный от предыдущего, это происходит только в конце видео.
Если мы выберем размер партии такой, что
video_size% batch_size == 0
ошибка также не возникает.
Мы используем TF, построенный из источник (master
ветка).
Кто-нибудь знает решение этой проблемы?
Задача ещё не решена.
Других решений пока нет …