This work allow to perform ship detection using self-supervised learning (SSL). A Sentinel-2 dataset for ship detection is provided. Check our article for more details
pip3 install -r requirements.txtA docker with a correctly configured environment can be built using the Dockerfile.
It contains the COCO annotations files, the 12 spectral bands for each S2-SHIPS tile in a tif or numpy array version, the S2-SHIPS segmentation masks and the water masks. Please contact [email protected] to access the dataset.
To pretrain a ResNet-50 backbone via SSL on a non labeled dataset having 6 channels, use the following command :
python3 train_pretext.py --run_name test_pretext --dataset /path/to/dataset --model moco_sat --channels 6 --save_dir /saving/pathYou will need to modify the data loading part in the script if you use another dataset than the one used in the script.
If a MLflow backend is used, add the experiment ID :
python3 train_pretext.py --dataset /path/to/dataset --model moco_sat --channels 6 --exp_ID 1To use SSL pretrained weights to initialize a ResNet classifier for classifying ship/non ship patches, use this command :
python3 downstream_classification.py --run_name test_downstream_class --dataset /path/to/dataset --model moco_sat --channels 6 --save_dir /saving/path --weights /path/to/weights --nb_class 2 --mode ft --test yYou will need to modify the data loading part in the script if you use another dataset than the AIS ship detection dataset from Agenium Space.
If you prefer to do transfer learning instead of fine-tuning, change the "mode" argument to "tf". If a MLflow backend is used, add the experiment ID option.
To use SSL pretrained weights to initialize a U-Net classifier to perform ship/non ship segmentation, use this command for training in a leave-one-out setting:
python3 U_net_ship.py --run_name test_unet --train-path /path/to/training/set --test-path /path/to/test/set --in-channels 6 --save_results /saving/path --weights /path/to/weights --num-classes 2 --mode ftIf you want to vary the number of training sample and test on only 3 images, use the following command :
python3 U_net_ship.py --run_name test_unet --train-path /path/to/training/set --test-path /path/to/test/set --in-channels 6 --save_results /saving/path --weights /path/to/weights --num-classes 2 --mode ft --vary_nb_img yIf you prefer to do transfer learning instead of fine-tuning, change the "mode" argument to "tf". If a MLflow backend is used, add the experiment ID option. If you want to perform several runs, add the "iter" option with the desired number of runs.
To apply sea/land filtering on the results obtained by the segmentation, use this command :
python3 filter.py --filters /path/to/sea-land-masks/ --json_dir /path/to/coco-annotations --dataset /path/to/predictions/to/filterTo try the baseline BL_NDWI, do as follows :
python3 s2ships_gen_data.py --save_dir /saving/path Please cite using the bibtex generated from the MDPI article page
for example as:
@Article{rs13214255,
AUTHOR = {Ciocarlan, Alina and Stoian, Andrei},
TITLE = {Ship Detection in Sentinel 2 Multi-Spectral Images with Self-Supervised Learning},
JOURNAL = {Remote Sensing},
VOLUME = {13},
YEAR = {2021},
NUMBER = {21},
ARTICLE-NUMBER = {4255},
URL = {https://www.mdpi.com/2072-4292/13/21/4255},
ISSN = {2072-4292},
DOI = {10.3390/rs13214255}
}