Keras implementation of RetinaNet object detection as described in Focal Loss for Dense Object Detection.
This code is borrowed from Keras Implementation of this model at https://github.com/fizyr/keras-retinanet and updated to run on Liza Aletr Drone Dataset
- Clone this repository.
cd RetinaNet
- Ensure numpy is installed using
pip install numpy --user
- In the repository, execute
pip install . --user
. Note that due to inconsistencies with howtensorflow
should be installed, this package does not define a dependency ontensorflow
as it will try to install that (which at least on Arch Linux results in an incorrect installation). Please make suretensorflow
is installed as per your systems requirements. - Alternatively, you can run the code directly from the cloned repository, however you need to run
python setup.py build_ext --inplace
to compile Cython code first. - Optionally, install
pycocotools
if you want to train / test on the MS COCO dataset by runningpip install --user git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI
.
For training on a [custom dataset], a CSV file can be used as a way to pass the data. See below for more details on the format of these CSV files.
To train using your CSV, run:
keras_retinanet/bin/train.py --weights snapshots/resnet50_coco_best_v2.1.0.h5 csv ../data/SDD-CSV/train_annotations.csv labels.csv --val-annotations ../data/SDD-CSV/val_annotations.csv
First step to train on SDD dataset
To train using your Pascal VOC, run:
keras_retinanet/bin/train.py --weights snapshots/resnet50_base_best.h5 --freeze-backbone --config config.ini pascal ../data/LADD
Second step to train on LADD dataset and fine-tuning model
Running directly from RetinaNet
folder in the repository
Here
- weights: Path to the weights for initializing training
- csv indicates retinanet is trained on a custom data set
- train_annotations.csv is path to training annotations
- labels.csv are the labels in the format class_name, class_id with 0 reserved for background class
- val_annotations is path to validation annotations
- config.ini configuration file
If your dataset is small, you can also use the --freeze-backbone argument
to freeze the backbone layers.
I uploaded the images used for training and validation to the yandex disk link below. Please download the same: https://yadi.sk/d/4Hz_1qpiNbHhpQ
The CSV file with annotations should contain one annotation per line. Images with multiple bounding boxes should use one row per bounding box. Note that indexing for pixel values starts at 0. The expected format of each line is:
path/to/image.jpg,x1,y1,x2,y2,class_name
Labels format
The class name to ID mapping file should contain one mapping per line. Each line should use the following format:
class_name,id
To calculate mean average precision on the validation set, please run
keras_retinanet/bin/evaluate.py csv val_annotations.csv labels.csv snapshots/resnet50_csv_31_interface.h5
or for Pascal VOC
keras_retinanet/bin/evaluate.py pascal ../data/LADD snapshots/resnet50_pascal_06.h5 --convert-model
Here we pass the val_annotations, labels and path to the trained weights
To run inference on the trained model, first step is to convert the trained model to a format that can be used by inference. The command for this is:
keras_retinanet/bin/convert_model.py snapshots/resnet50_pascal_08.h5 snapshots/resnet50_pascal_08_inference.h5
Here first path is the path to the trained model and the second would be the path to the converted inference model
I created two notebooks from the original code that can be used to run inference on images and on videos.
The notebooks are:
- RetinaNet/ResNet50RetinaNet-Image.ipynb : For inference on a batch of images
- RetinaNet/ResNet50RetinaNet-Video.ipynb : For inference on a video