Параллельный фреймвок или библиотека
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 02.12.18 09:45
Оценка:
Всем привет!
Мне в проекте по распознаванию/трекингу объектов на видео понадобилось как-нибудь гибко раскидывать задачи по потокам.
Вкратце опишу последовательный пайплайн:
1. Захват и декодирование с камеры очередного кадра.
2. Распознавание объектов на нём.
3. Трекинг распознанных объектов.
4. Распознавание номеров, если объект — автомобиль.
5. Отображение кадра.
6. Сохранение кадра и результатов распознавания.

Каждая операция может быть как быстрой, так и достаточно медленной. Поясню: видео можно декодировать аппаратно (если железо поддерживает), а можно и нет. Объекты могут распознаваться быстро (если есть мощная нвидиевская видеокарточка), а могут и нет. Трекинг может длиться 1-2 млсек, а может и 20 млсек, если объектов много. Распознавание номеров может вообще ничего не занимать, если автомобилей нет, а может и нормально.
Например, захват, декодирование и распознавание объектов (пункты 1 и 2) должны идти друг за другом. Далее трекинг и распознавание номеров (3 и 4) могут работать параллельно, отображение и сохранение (5 и 6) ждут результатов трекинга (но не распознавания номеров!), чтобы нарисовать траекторию. При этом, пунктам 1 и 2 не обязательно дожидаться завершения 3-6, они могут начинать работать сразу же после своего завершения.
Думаю понятно.

Вот тут хочется одновременно применить два способа распараллеливания.
1. Что-то типа taskflow, где я выделяю последовательные части пайплайна и параллельные, сделать типа графа задач.
2. Сделать в отдельном низкоприоритетном потоке распознавание номеров и очередь сообщений к нему, в которую засылать кусочки изображения для распознавания и выгребать результаты по мере поступления. Этих результатов ждать не надо, распознается секундой раньше или секундой позже — без разницы.

Для параллелизма типа 1 нашёл библиотеки cpp-taskflow (на CppCon2018 о ней рассказывали) и более продвинутый вариант Threading Building Blocks (TBB). Что скажете? Что лучше выбрать? Я так понимаю, Microsoft забили в своём компиляторе на openmp, для кроссплатформенного софта на неё даже смотреть смысла нет.
Для очереди с сообщениями, видимо, надо искать что-то альтернативное и ни в одну из указанных библиотек её не уложить.

Библиотека ищется по возможности простая и для Win|Lin|Mac.

P.S. Сейчас это всё как-то делается вручную, но хочется красиво отрефакторить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.