Pytorch Реализация Flownet Dosovitskiy et al.
Этот репозиторий является внедрением Forwnet, от Alexey Dosovitskiy et al. в Pytorch. См. Реализацию факела здесь
Этот код в основном вдохновлен официальным примером ImageNet. Он не был протестирован на несколько графических процессоров, но он должен работать так же, как в исходном коде.
Код содержит пример обучения, используя набор данных Flying Chair, с увеличением данных. Реализация для наборов данных сцены может быть добавлена в будущем.
В настоящее время предоставляются две модели нейронной сети, наряду с их изменением партии (экспериментально):
Благодаря Kaixhin вы можете скачать предварительную версию Flownets (из Caffe, а не из Pytorch) здесь. Эта папка также содержит обученные сети с нуля.
Прямо надайте загруженную сеть сценарию, вам не нужно распаковать ее, даже если ваша среда настольных компьютеров сообщает вам об этом.
Эти сети ожидают ввода BGR (по сравнению с RGB в Pytorch). Однако порядок BGR не очень важен.
Эти модули могут быть установлены с помощью pip
pytorch >= 1.2
tensorboard-pytorch
tensorboardX >= 1.4
spatial-correlation-sampler>=0.2.1
imageio
argparse
path.py
или
pip install -r requirements.txtВо -первых, вам нужно скачать набор данных Flying Chair. Он на ~ 64 ГБ, и мы рекомендуем вам поместить его в диск SSD.
Гиперпараметры по умолчанию, предоставленные в main.py такие же, как в тренировочных сценариях Caffe.
python main.py /path/to/flying_chairs/ -b8 -j8 -a flownetsМы рекомендуем вам установить J (количество потоков данных) на высокое место, если вы используете DataUagmentation, чтобы избежать загрузки данных, чтобы замедлить обучение.
Для получения дополнительной помощи вы можете напечатать
python main.py -hTensorboard-Pytorch используется для регистрации. Чтобы визуализировать результат, просто введите
tensorboard --logdir=/path/to/checkpointsМодели могут быть загружены здесь, в папке Pytorch.
Модели были обучены параметрам по умолчанию, если не указано. Цветовое деформирование не использовалось.
| Архи | скорость обучения | Размер партии | Размер эпохи | имя файла | валидация EPE |
|---|---|---|---|---|---|
| Пролетают | 1E-4 | 8 | 2700 | FLOWNET_EPE1.951.PTH.TAR | 1.951 |
| Flownets Bn | 1E-3 | 32 | 695 | Flownets_bn_epe2.459.pth.tar | 2.459 |
| Flownetc | 1E-4 | 8 | 2700 | FLOWNETC_EPE1.766.PTH.TAR | 1.766 |
ПРИМЕЧАНИЕ : Flownets BN потребовалось больше времени, чтобы тренироваться и получить худшие результаты. Настоятельно рекомендуется не использовать его для набора данных для летательных стульев.
Предсказание производится с помощью Flownets.
Точный код для оптического потока -> цветной карты можно найти здесь
| Вход | прогноз | Groundtruth |
|---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
Если вам нужно запустить сеть на своих изображениях, вы можете скачать предварительную сеть здесь и запустить сценарий логирования в папке пар изображений.
Ваша папка должна иметь все пары изображений в одном месте, с шаблоном имени
{image_name}1.{ext}
{image_name}2.{ext}
python3 run_inference.py /path/to/images/folder /path/to/pretrained Что касается сценария main.py , то для дополнительных вариантов доступно меню справки.
Чтобы иметь когерентные преобразования между входами и мишенью, мы должны определять новые преобразования, которые принимают как вход, так и цель, поскольку новая случайная переменная определяется каждый раз, когда вызывается случайное преобразование.
Чтобы разрешить увеличение данных, мы рассмотрели вращение и переводы для входов и их результат на целевой карте потока. Вот набор вещей, о которых нужно позаботиться, чтобы достичь правильного увеличения данных
Если вы примените преобразование на IMG1, вы должны применить то же самое к карте потока, чтобы получить когерентные точки происхождения для потока.
Учитывая перевод (tx,ty) применяемый на IMG2, у нас будет
flow[:,:,0] += tx
flow[:,:,1] += ty
Шкала, применяемая как на IMG1, так и на IMG2 с параметрами Zoom alpha умножает поток на одинаковое количество
flow *= alpha
Вращение, приложенное на обоих изображениях с помощью угловой theta также поворачивает векторы потока ( flow[i,j] ) под одним и тем же углом
for_all i,j flow[i,j] = rotate(flow[i,j], theta)
rotate: x,y,theta -> (x*cos(theta)-x*sin(theta), y*cos(theta), x*sin(theta))
Давайте рассмотрим вращение по угловой theta из центра изображений.
Мы должны трансформировать каждый вектор потока на основе координат, где он приземляется. На каждой координате (i, j) у нас есть:
flow[i, j, 0] += (cos(theta) - 1) * (j - w/2 + flow[i, j, 0]) + sin(theta) * (i - h/2 + flow[i, j, 1])
flow[i, j, 1] += -sin(theta) * (j - w/2 + flow[i, j, 0]) + (cos(theta) - 1) * (i - h/2 + flow[i, j, 1])