# FlowNetPytorch **Repository Path**: winday00/FlowNetPytorch ## Basic Information - **Project Name**: FlowNetPytorch - **Description**: Pytorch implementation of FlowNet by Dosovitskiy et al. - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-09-23 - **Last Updated**: 2022-04-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FlowNetPytorch Pytorch implementation of FlowNet by Dosovitskiy et al. This repository is a torch implementation of [FlowNet](http://lmb.informatik.uni-freiburg.de/Publications/2015/DFIB15/), by [Alexey Dosovitskiy](http://lmb.informatik.uni-freiburg.de/people/dosovits/) et al. in PyTorch. See Torch implementation [here](https://github.com/ClementPinard/FlowNetTorch) This code is mainly inspired from official [imagenet example](https://github.com/pytorch/examples/tree/master/imagenet). It has not been tested for multiple GPU, but it should work just as in original code. The code provides a training example, using [the flying chair dataset](http://lmb.informatik.uni-freiburg.de/resources/datasets/FlyingChairs.en.html) , with data augmentation. An implementation for [Scene Flow Datasets](http://lmb.informatik.uni-freiburg.de/resources/datasets/SceneFlowDatasets.en.html) may be added in the future. Two neural network models are currently provided, along with their batch norm variation (experimental) : - **FlowNetS** - **FlowNetSBN** - **FlowNetC** - **FlowNetCBN** ## Pretrained Models Thanks to [Kaixhin](https://github.com/Kaixhin) you can download a pretrained version of FlowNetS (from caffe, not from pytorch) [here](https://drive.google.com/drive/folders/0B5EC7HMbyk3CbjFPb0RuODI3NmM?resourcekey=0-SuPU4qVZzuB4s83ngjrAEg&usp=sharing). This folder also contains trained networks from scratch. ### Note on networks loading Directly feed the downloaded Network to the script, you don't need to uncompress it even if your desktop environment tells you so. ### Note on networks from caffe These networks expect a BGR input (compared to RGB in pytorch). However, BGR order is not very important. ## Prerequisite these modules can be installed with `pip` ``` pytorch >= 1.2 tensorboard-pytorch tensorboardX >= 1.4 spatial-correlation-sampler>=0.2.1 imageio argparse path.py ``` or ```bash pip install -r requirements.txt ``` ## Training on Flying Chair Dataset First, you need to download the [the flying chair dataset](http://lmb.informatik.uni-freiburg.de/resources/datasets/FlyingChairs.en.html) . It is ~64GB big and we recommend you put it in a SSD Drive. Default HyperParameters provided in `main.py` are the same as in the caffe training scripts. * Example usage for FlowNetS : ```bash python main.py /path/to/flying_chairs/ -b8 -j8 -a flownets ``` We recommend you set j (number of data threads) to high if you use DataAugmentation as to avoid data loading to slow the training. For further help you can type ```bash python main.py -h ``` ## Visualizing training [Tensorboard-pytorch](https://github.com/lanpa/tensorboard-pytorch) is used for logging. To visualize result, simply type ```bash tensorboard --logdir=/path/to/checkoints ``` ## Training results Models can be downloaded [here](https://drive.google.com/drive/folders/0B5EC7HMbyk3CbjFPb0RuODI3NmM?resourcekey=0-SuPU4qVZzuB4s83ngjrAEg&usp=sharing) in the pytorch folder. Models were trained with default options unless specified. Color warping was not used. | Arch | learning rate | batch size | epoch size | filename | validation EPE | | ----------- | ------------- | ---------- | ---------- | ---------------------------- | -------------- | | FlowNetS | 1e-4 | 8 | 2700 | flownets_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 | *Note* : FlowNetS BN took longer to train and got worse results. It is strongly advised not to you use it for Flying Chairs dataset. ## Validation samples Prediction are made by FlowNetS. Exact code for Optical Flow -> Color map can be found [here](main.py#L321) | Input | prediction | GroundTruth | |-------|------------|-------------| | | | | | | | | | | | | ## Running inference on a set of image pairs If you need to run the network on your images, you can download a pretrained network [here](https://drive.google.com/open?id=0B5EC7HMbyk3CbjFPb0RuODI3NmM) and launch the inference script on your folder of image pairs. Your folder needs to have all the images pairs in the same location, with the name pattern ``` {image_name}1.{ext} {image_name}2.{ext} ``` ```bash python3 run_inference.py /path/to/images/folder /path/to/pretrained ``` As for the `main.py` script, a help menu is available for additional options. ## Note on transform functions In order to have coherent transformations between inputs and target, we must define new transformations that take both input and target, as a new random variable is defined each time a random transformation is called. ### Flow Transformations To allow data augmentation, we have considered rotation and translations for inputs and their result on target flow Map. Here is a set of things to take care of in order to achieve a proper data augmentation #### The Flow Map is directly linked to img1 If you apply a transformation on img1, you have to apply the very same to Flow Map, to get coherent origin points for flow. #### Translation between img1 and img2 Given a translation `(tx,ty)` applied on img2, we will have ``` flow[:,:,0] += tx flow[:,:,1] += ty ``` #### Scale A scale applied on both img1 and img2 with a zoom parameters `alpha` multiplies the flow by the same amount ``` flow *= alpha ``` #### Rotation applied on both images A rotation applied on both images by an angle `theta` also rotates flow vectors (`flow[i,j]`) by the same angle ``` \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)) ``` #### Rotation applied on img2 Let us consider a rotation by the angle `theta` from the image center. We must tranform each flow vector based on the coordinates where it lands. On each coordinate `(i, j)`, we have: ``` 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]) ```