Implementação de Pytorch de Flownet por Dosovitskiy et al.
Este repositório é uma implementação da tocha de Flownet, de Alexey Dosovitskiy et al. Em Pytorch. Veja a implementação da tocha aqui
Este código é inspirado principalmente no exemplo oficial do ImageNet. Ele não foi testado para múltiplas GPU, mas deve funcionar como no código original.
O código fornece um exemplo de treinamento, usando o conjunto de dados da cadeira voadora, com aumento de dados. Uma implementação para conjuntos de dados de fluxo de cenas pode ser adicionada no futuro.
Atualmente, dois modelos de rede neural são fornecidos, juntamente com sua variação de norma em lote (experimental):
Graças ao KAIXHIN, você pode baixar uma versão pré -traida do FLOWNETS (de Caffe, não de Pytorch) aqui. Esta pasta também contém redes treinadas do zero.
Alimente diretamente a rede baixada com o script, você não precisa descomputá -lo, mesmo que o seu ambiente de desktop indique isso.
Essas redes esperam uma entrada BGR (em comparação com RGB em Pytorch). No entanto, a ordem BGR não é muito importante.
Esses módulos podem ser instalados com pip
pytorch >= 1.2
tensorboard-pytorch
tensorboardX >= 1.4
spatial-correlation-sampler>=0.2.1
imageio
argparse
path.py
ou
pip install -r requirements.txtPrimeiro, você precisa baixar o conjunto de dados da cadeira voadora. É ~ 64 GB grande e recomendamos que você o coloque em uma unidade SSD.
Os hyperparameters padrão fornecidos em main.py são os mesmos dos scripts de treinamento de Caffe.
python main.py /path/to/flying_chairs/ -b8 -j8 -a flownetsRecomendamos que você defina J (número de threads de dados) como alto se você usar o DataAgmentation para evitar o carregamento de dados para retardar o treinamento.
Para mais ajuda, você pode digitar
python main.py -hO Tensorboard-Pytorch é usado para log. Para visualizar o resultado, basta digitar
tensorboard --logdir=/path/to/checkpointsOs modelos podem ser baixados aqui na pasta Pytorch.
Os modelos foram treinados com opções padrão, a menos que especificado. A deformação colorida não foi usada.
| Arco | taxa de aprendizado | Tamanho do lote | Tamanho da época | nome do arquivo | Validação EPE |
|---|---|---|---|---|---|
| FLOWNETS | 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 |
Nota : Flownets BN levou mais tempo para treinar e obteve resultados piores. É fortemente aconselhado a você não usá -lo para o conjunto de dados de cadeiras voadoras.
A previsão é feita por Flownets.
Código exato para fluxo óptico -> mapa de cores pode ser encontrado aqui
| Entrada | Previsão | Truta fundamental |
|---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
Se você precisar executar a rede em suas imagens, poderá fazer o download de uma rede pré -treinada aqui e iniciar o script de inferência em sua pasta de pares de imagens.
Sua pasta precisa ter todos os pares de imagens no mesmo local, com o padrão de nome
{image_name}1.{ext}
{image_name}2.{ext}
python3 run_inference.py /path/to/images/folder /path/to/pretrained Quanto ao script main.py , um menu de ajuda está disponível para opções adicionais.
Para ter transformações coerentes entre entradas e destino, devemos definir novas transformações que recebem entrada e destino, pois uma nova variável aleatória é definida cada vez que uma transformação aleatória é chamada.
Para permitir o aumento de dados, consideramos rotação e traduções para entradas e seu resultado no mapa de fluxo de destino. Aqui está um conjunto de coisas para cuidar para obter um aumento adequado de dados
Se você aplicar uma transformação no IMG1, deverá aplicar o mesmo no mapa de fluxo, para obter pontos de origem coerente para o fluxo.
Dada uma tradução (tx,ty) aplicada no img2, teremos
flow[:,:,0] += tx
flow[:,:,1] += ty
Uma escala aplicada no IMG1 e IMG2 com um zoom parâmetros alpha multiplica o fluxo pela mesma quantidade
flow *= alpha
Uma rotação aplicada nas duas imagens por um ângulo theta também gira os vetores de fluxo ( flow[i,j] ) pelo mesmo ângulo
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))
Vamos considerar uma rotação pelo ângulo theta do centro de imagem.
Devemos transportar cada vetor de fluxo com base nas coordenadas onde ele pousa. Em cada coordenada (i, j) , temos:
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])