2012-06-19 6 views
0

Я изучаю это поле, чтобы получить обнаружение объекта в реальном времени.Обнаружение объектов в реальном времени (просеивание)?

Видео пример:

Но как они могут извлечь просеять Keypoint и сопоставляя их так быстро?
экстракция SIFT требует второй обычно

+0

Я думаю, что вы можете найти ответы здесь http://stackoverflow.com/questions/6960455/sift-and-keypoint – Mark

ответ

2

SIFT можно ускорить несколько способов:

  • , если вы можете позволить себе приближение, то можно вывести Keypoint называется SURF, которая намного быстрее (используя интегральные изображения для большинство задач)

  • Вы можете использовать параллельные реализации на уровне ЦП (например, OpenCV использует TBB от Intel) или на уровне графического процессора (google для просеивания gpu для соответствующего кода и документа).

Во всяком случае, ни один из них не доступен (AFAIK) в Java, так что вам придется использовать оболочку Java для OpenCV или работать его самостоятельно.

2

Общая и первая идея: спросите пользователей видео. Мы можем просто предположить, что сделано или как это делается. Это также может помочь узнать, что вы сделали до сих пор (например, разрешение видео, мощность обработки, подготовка изображения и т. Д.).

Я не использовал SIFT специально, но в течение последних нескольких лет у меня было довольно некоторое отслеживание объектов/движений, так что это больше в целом. Возможно, вы уже пробовали некоторые моменты, я не знаю.

  • Уменьшить разрешение изображения: Переход от 640x480 в 320x240 сократит ваши данные до 25%. Снижение до 160x120 сократит его еще на 25% (поэтому осталось 6,25% данных) без существенного влияния на ваш алгоритм.
  • Аналогичным образом может быть полезно уменьшить глубину цвета вашего изображения (не только 256 оттенков серого, но, возможно, даже больше, например 64 цвета).
  • Попробуйте другие способы сделать функции более очевидными или более быстрыми, чтобы найти, например. попробуйте запустить детектор кромок над вашим изображением.
  • По крайней мере, второе видео упоминает систему слежения, поэтому вы можете попытаться угадать область, в которой отслеживаемый объект должен появиться в следующем кадре (с использованием какого-либо простого фильтра a/b или любого из них по координатам и, возможно, вращению), затем используйте SIFT на этой суб-области (с некоторым добавленным запасом). Только проанализируйте весь образ, если вы не можете найти его снова. Примерно в течение 40 или 50 секунд во втором видео они теряют объект и требуют достаточно времени/попыток найти его снова.
+0

Да я предполагаю, что они извлекают просеять только на небольшая часть изображений, и если они не найдут ее, они будут искать по всему изображению, замедляя ее. Но все же это довольно чертовски быстро – dynamic

4

Я разработчик OpenIMAJ и ответственный за создание первого видео.

Мы не делаем ничего особенного, чтобы ускорить согласование в этом видео, а обнаружение и изъятие SIFT выполняется на всех кадрах. На самом деле, видео было сделано хорошо, прежде чем мы сделали какую-либо оптимизацию; текущая версия этой демонстрации намного более гладко. У нас также есть версия с гибридным KLT-трекером, который работает еще быстрее, не выполняя SIFT на каждом кадре.

Как было предложено @Mario, размер изображения сильно влияет на скорость извлечения, поэтому обработка меньшего кадра может дать большой выигрыш. Во-вторых, в первоначальном описании разности гауссовской точки интереса, предложенной Лоу в статье SIFT, было предложено, чтобы входное изображение было сначала удвоено по размеру, чтобы увеличить количество функций. Не выполняя эту двойную калибровку, вы также получаете большой прирост производительности за счет меньшего количества функций для соответствия.

Код с открытым исходным кодом (лицензия BSD), и вы можете получить его, следуя ссылкам на http://www.openimaj.org. Как указано в описании видео, код обработки изображений является чистой Java; единственный собственный код - тонкий интерфейс к веб-камере. Учебное пособие № 7 в current tutorial pdf document проходит через процесс использования SIFT в OpenIMAJ. Отключение двойной проклейки может быть достигнуто, выполнив:

DoGSIFTEngine engine = new DoGSIFTEngine(); 
engine.getOptions().setDoubleInitialImage(false);