Представление решения команды(8 минут): https://youtu.be/zqmljRcZI-Q?t=2375.
Оптический поток (ОП) – изображение видимого движения, представляющее собой сдвиг каждой точки между двумя изображениями. Он представляет собой поле скоростей (т. к. сдвиг с точностью до масштаба эквивалентен мгновенной скорости).
Для решения данной задачи будем использовать обученный FlowNet2:
Расположены в рекомендуемом порядке для ознаколмелния.
Ilg E. et al. Flownet 2.0: Evolution of optical flow estimation with deep networks //Proceedings of the IEEE conference on computer vision and pattern recognition. – 2017. – С. 2462-2470. (https://openaccess.thecvf.com/content_cvpr_2017/papers/Ilg_FlowNet_2.0_Evolution_CVPR_2017_paper.pdf)
"Оптический поток", Михаил Романов "Samsung AI Innovation Campus - Russia" Статьи на ит порталах:
То, что вы хотели знать про оптический поток, но стеснялись спросить (https://habr.com/ru/post/201406/)
Generating optical flow using NVIDIA flownet2-pytorch implementation (https://towardsdatascience.com/generating-optical-flow-using-nvidia-flownet2-pytorch-implementation-d7b0ae6f8320?gi=840c37088f65)
Укажем путь по которому хранится видео флотации, для которого мы хотим оценивать поле векторов скоростей потока
vid_file= '/content/gdrive/MyDrive/NorNikel_hakaton/dataset1-1/F1_1_1_1.ts'
Задаем путь по которому храниться маска кодирующая область интереса, часть кадра видео по которому будут считать вектора скоростей потока маска == 1 потоки будут показаны, маска == 0 для этих точек произойдет зануление векторов скоростей
FlowNet2 будет оценивать скорости поток для всего кадра в том числе и для потока который стекают в желоб а его нам нужно игнорировать. скорость там существенно выше и при вычислении усредненной скорости тока по всему кадру появятся погрешности.
чтобы этого не происходило надо взять первый кадр видео, в любом растровом редакторе (например MS Paint) закрасить белым ту область где мы хотим вычислять векторные поля скоростей и по кторой будем оценивать средняя скорость.
Это делает один раз для одной камеры флотации. если камера не меняет своего положения, менять маску не нужно.
По умолчанию наша реализация работает с маской, чтобы работать без маски в качестве маски можно уразать просто белый лист, тогда вектора будут оцениваться по всему кадру.
mask_path = '/content/gdrive/MyDrive/NorNikel_hakaton/dataset1-1/Mask_F1_1_1_1.jpg'
если мы хоти наложить поверх цветовой визуализации поля векторов скорости линии тока(потока) и вывод усреденнной скорости потока по всей пене, то ставим этот флаг в True ели интересует только цветовая визуализация поля векторов скорости, то ставим False
flag_visualise_flows_and_speed = True
Генерируем файлы для флоунет. .flo файлы это файлы преставляющие собой бинарные матрицы векторого поля скоростей частиц, которые будут оценивать скорости в пикселя изображения.
Они имет размерность (высота картинки в пикселях, ширина картинки в пикселях) каждый элемент которого представляет собой двумерный вектор скорости потока (x - компонента, у - компонента)
В нашем случае, модель принимает на вход кадр видео (600, 800). Во время предсказания модель пережмет ее в картинку (256, 256). Сделает предсказание векторов скорстей потока и произведет обратное расширение почти до начального размера, но с некоторыми потерями получится (576, 768). И каждым элементом этой матрицы является двумерный вектор (x,y). Поэтому итоговая размерность будет (576, 768, 2)
Поскольку нарисовать в каждом пикселе изображения вектор не представляется возможным, для визуализации векторов в каждом пикселе изображения используется цветовая кодировка.
Цветовая кодировка модуля и напрвления векторов скоростей в каждом пикселе изображения, приведена на рисунке ниже.
Является общепринятой. Функции ниже придерживаются данной цветовой маркировки.
Наложим на изображение с цветовой визуализацией поля векторов скорости flow_on_frame_img, визуализацию векторов в виде линий тока(потока), рассчитывает среднюю скорость по всему что находится в внутри зоны интереса задаваемой маской, расположенной по пути mask_path и сохраняет данную визуализацию в виде картинки по указанному в save_path пути.