Use Tello drones to perform object detection, using PyTorch implementation of YOLOv3 to support training, inference and evaluation. Visit https://github.com/ssling0817/Drone-Autonomous-Navigation-Project-Guildline for algorithm explanation.
$ git clone https://github.com/ssling0817/UAV_Object_Detection
$ cd PyTorch-YOLOv3/
$ sudo pip3 install -r requirements.txt
Run the commands below to create a custom model definition, replacing <num-classes> with the number of classes in your dataset.
$ cd config/ # Navigate to config dir
$ bash create_custom_model.sh <num-classes> # Will create custom model 'yolov3-custom.cfg'
Add class names to data/custom/classes.names. This file should have one row per class name.
Move the images of your dataset to data/custom/images/.
Move your annotations to data/custom/labels/. The dataloader expects that the annotation file corresponding to the image data/custom/images/train.jpg has the path data/custom/labels/train.txt. Each row in the annotation file should define one bounding box, using the syntax label_idx x_center y_center width height. The coordinates should be scaled [0, 1], and the label_idx should be zero-indexed and correspond to the row number of the class name in data/custom/classes.names.
To train on the custom dataset run:
$ python3 merge_names.py
It will automatically create train and validation sets in data/custom/train.txt anddata/custom/vak.txt which are yout paths to images that will be used as train and validation data respectively.
To train on the custom dataset run:
$ python3 train.py --model_def config/yolov3-custom.cfg --data_config config/custom.data
Add --pretrained_weights weights/darknet53.conv.74 to train using a backend pretrained on ImageNet.
To test on the custom dataset using UAV:
$ python3 test_detection.py --model_def config/yolov3-custom.cfg --data_config config/custom.data
Change target in detect_UAV.py, it will change the detect target of the drone. Make sure this target exists in your data/custom/classes.names.
$ cd weights/
$ bash download_weights.sh
$ cd data/
$ bash get_coco_dataset.sh
Evaluates the model on COCO test.
$ python3 test.py --weights_path weights/yolov3.weights
| Model | mAP (min. 50 IoU) |
|---|---|
| YOLOv3 608 (paper) | 57.9 |
| YOLOv3 608 (this impl.) | 57.3 |
| YOLOv3 416 (paper) | 55.3 |
| YOLOv3 416 (this impl.) | 55.5 |
$ train.py [-h] [--epochs EPOCHS]
[--model_def MODEL_DEF] [--data_config DATA_CONFIG]
[--pretrained_weights PRETRAINED_WEIGHTS] [--n_cpu N_CPU]
[--img_size IMG_SIZE]
[--checkpoint_interval CHECKPOINT_INTERVAL]
[--evaluation_interval EVALUATION_INTERVAL]
[--multiscale_training MULTISCALE_TRAINING]
To train on COCO using a Darknet-53 backend pretrained on ImageNet run:
$ python3 train.py --data_config config/coco.data --pretrained_weights weights/darknet53.conv.74
---- [Epoch 7/100, Batch 7300/14658] ----
+------------+--------------+--------------+--------------+
| Metrics | YOLO Layer 0 | YOLO Layer 1 | YOLO Layer 2 |
+------------+--------------+--------------+--------------+
| grid_size | 16 | 32 | 64 |
| loss | 1.554926 | 1.446884 | 1.427585 |
| x | 0.028157 | 0.044483 | 0.051159 |
| y | 0.040524 | 0.035687 | 0.046307 |
| w | 0.078980 | 0.066310 | 0.027984 |
| h | 0.133414 | 0.094540 | 0.037121 |
| conf | 1.234448 | 1.165665 | 1.223495 |
| cls | 0.039402 | 0.040198 | 0.041520 |
| cls_acc | 44.44% | 43.59% | 32.50% |
| recall50 | 0.361111 | 0.384615 | 0.300000 |
| recall75 | 0.222222 | 0.282051 | 0.300000 |
| precision | 0.520000 | 0.300000 | 0.070175 |
| conf_obj | 0.599058 | 0.622685 | 0.651472 |
| conf_noobj | 0.003778 | 0.004039 | 0.004044 |
+------------+--------------+--------------+--------------+
Total Loss 4.429395
---- ETA 0:35:48.821929
Track training progress in Tensorboard:
- Initialize training
- Run the command below
- Go to http://localhost:6006/
$ tensorboard --logdir='logs' --port=6006
Storing the logs on a slow drive possibly leads to a significant training speed decrease.
You can adjust the log directory using --logdir <path> when running tensorboard or the train.py.
Joseph Redmon, Ali Farhadi
[Paper] [Project Webpage] [Authors' Implementation]
@article{yolov3,
title={YOLOv3: An Incremental Improvement},
author={Redmon, Joseph and Farhadi, Ali},
journal = {arXiv},
year={2018}
}