Recently, I optimize my YOLO project:
https://github.com/yjh0410/PyTorch_YOLO-Family
In my new YOLO project, you can enjoy:
- a new and stronger YOLOv1
- a new and stronger YOLOv2
- YOLOv3
- YOLOv3 with SPP
- YOLOv3 with DilatedEncoder
- YOLOv4-Exp ~ (I'm trying to make it better)
- YOLO-Tiny
- YOLO-Nano
In this project, you can enjoy:
- YOLOv2 with DarkNet-19
- YOLOv2 with ResNet-50
- YOLOv2Slim
- YOLOv3
- YOLOv3Spp
- YOLOv3Tiny
I just want to provide a good YOLO project for everyone who is interested in Object Detection.
Google Drive: https://drive.google.com/drive/folders/1T5hHyGICbFSdu6u2_vqvxn_puotvPsbd?usp=sharing
BaiDuYunDisk: https://pan.baidu.com/s/1tSylvzOVFReUAvaAxKRSwg Password d266
You can download all my models from the above links.
First of all, I reproduce the backbones used in YOLO.
size | top1 | |
darknet19 | 224 | 72.96 |
darknet19 | 448 | 75.52 |
size | top1 | |
darknet53 | 224 | 75.42 |
darknet53 | 448 | 77.76 |
size | top1 | |
cspdarknet53 | 224 | 75.7 |
cspdarknet53-448 | 448 | 76.9 |
Tricks in official paper:
- batch norm
- hi-res classifier
- convolutional
- anchor boxes
- new network
- dimension priors
- location prediction
- passthrough
- multi-scale
- hi-red detector
Then I train my YOLOv2 on VOC dataset. I really enjoy yolo. It is so amazing! I think I have achieved this goal:
size | Original (darknet) | Ours (pytorch) 160peochs | Ours (pytorch) 250epochs | |
VOC07 test | 416 | 76.8 | 76.0 | 77.1 |
VOC07 test | 544 | 78.6 | 77.0 | 78.1 |
With 160 training epochs, my yolo-v2 only gets 76.0 mAP with 416 input size and 77.0 mAP with 544 input size. To be better, I add another 90 epochs. With 250 training epochs, my yolo-v2 performs very well !
During testing stage, I set conf thresh as 0.001 and set nms thresh as 0.5 to obtain above results. To make my model faster, I set conf thresh as 0.01. With this higher conf thresh, my yolo-v2 still performs very well and gets 77.0 mAP with 416 input size and 78.0 mAP with 544 input size.
I visualize some detection results whose score is over 0.3 on VOC 2007 test:
COCO:
data | AP | AP50 | AP75 | AP_S | AP_M | AP_L | |
Original (darknet) | COCO test-dev | 21.6 | 44.0 | 19.2 | 5.0 | 22.4 | 35.5 |
Ours (pytorch) | COCO test-dev | 26.8 | 46.6 | 26.8 | 5.8 | 27.4 | 45.2 |
Ours (pytorch) | COCO eval | 26.6 | 46.0 | 26.7 | 5.9 | 27.8 | 47.1 |
In TITAN Xp, my yolo-v2 runs at 100+ FPS, so it's very fast. I have no any TITAN X GPU, and I can't run my model in a X GPU. Sorry, guys~
Before I tell you how to use this project, I must say one important thing about difference between origin yolo-v2 and mine:
- For data augmentation, I copy the augmentation codes from the https://github.com/amdegroot/ssd.pytorch which is a superb project reproducing the SSD. If anyone is interested in SSD, just clone it to learn !(Don't forget to star it !)
So I don't write data augmentation by myself. I'm a little lazy~~
My loss function and groundtruth creator both in the tools.py
, and you can try to change any parameters to improve the model.
I replace darknet-19 with resnet-50 and get a better result on COCO-val
data | AP | AP50 | AP75 | AP_S | AP_M | AP_L | |
Our YOLOv2-320 | COCO eval | 25.8 | 44.6 | 25.9 | 4.6 | 26.8 | 47.9 |
Our YOLOv2-416 | COCO eval | 29.0 | 48.8 | 29.7 | 7.4 | 31.9 | 48.3 |
Our YOLOv2-512 | COCO eval | 30.4 | 51.6 | 30.9 | 10.1 | 34.9 | 46.6 |
Our YOLOv2-544 | COCO eval | 30.4 | 51.9 | 30.9 | 11.1 | 35.8 | 45.5 |
Our YOLOv2-608 | COCO eval | 29.2 | 51.6 | 29.1 | 13.6 | 36.8 | 40.5 |
I train my YOLOv3 on VOC:
size | Original (darknet) | Ours (pytorch) 250epochs | |
VOC07 test | 416 | 80.25 | 81.4 |
I use the same training strategy to my YOLOv2. My data-processing code is a little different from official YOLOv3. For more details, you can check my code files.
COCO:
Original YOLOv3:
data | AP | AP50 | AP75 | AP_S | AP_M | AP_L | |
YOLOv3-320 | COCO test-dev | 28.2 | 51.5 | - | - | - | - |
YOLOv3-416 | COCO test-dev | 31.0 | 55.3 | - | - | - | - |
YOLOv3-608 | COCO test-dev | 33.0 | 57.0 | 34.4 | 18.3 | 35.4 | 41.9 |
Our YOLOv3_PyTorch:
data | AP | AP50 | AP75 | AP_S | AP_M | AP_L | |
YOLOv3-320 | COCO test-dev | 33.1 | 54.1 | 34.5 | 12.1 | 34.5 | 49.6 |
YOLOv3-416 | COCO test-dev | 36.0 | 57.4 | 37.0 | 16.3 | 37.5 | 51.1 |
YOLOv3-608 | COCO test-dev | 37.6 | 59.4 | 39.9 | 20.4 | 39.9 | 48.2 |
My YOLOv3 is very stronger and better, right?
I also visualize some detection results whose score is over 0.3 on COCO 2017-val:
So, just have fun !
On COCO:
data | AP | AP50 | AP75 | AP_S | AP_M | AP_L | |
YOLOv3Spp-320 | COCO eval | 32.78 | 53.79 | 33.9 | 12.4 | 35.5 | 50.6 |
YOLOv3Spp-416 | COCO eval | 35.66 | 57.09 | 37.4 | 16.8 | 38.1 | 50.7 |
YOLOv3Spp-608 | COCO eval | 37.52 | 59.44 | 39.3 | 21.5 | 40.6 | 49.6 |
My YOLOv3SPP is not better than my YOLOv3. It is a little confusing ...
I build a very simple lightweight backbone: darknet_tiny
I replace the darknet19 used in YOLOv2 with darknet_tiny.
My SlimYOLOv2 is fast and strong. On VOC, it gets 70.7 mAP and 100+ FPS on 1660ti GPU.
Just enjoy it.
And, I'm still trying to make it faster without too much drop of precision.
We evaluate our YOLOv3Tiny on COCO-val with inputsize 608:
data | AP | AP50 | AP75 | AP_S | AP_M | AP_L | |
(official) YOLOv3Tiny | COCO test-dev | - | 33.1 | - | - | - | - |
(Our) YOLOv3Tiny | COCO val | 15.9 | 33.8 | 12.8 | 7.6 | 17.7 | 22.4 |
- Pytorch-gpu 1.1.0/1.2.0/1.3.0
- Tensorboard 1.14.
- opencv-python, python3.6/3.7
I copy the download files from the following excellent project: https://github.com/amdegroot/ssd.pytorch
I have uploaded the VOC2007 and VOC2012 to BaiDuYunDisk, so for researchers in China, you can download them from BaiDuYunDisk:
Link:https://pan.baidu.com/s/1tYPGCYGyC0wjpC97H-zzMQ
Password:4la9
You will get a VOCdevkit.zip
, then what you need to do is just to unzip it and put it into data/
. After that, the whole path to VOC dataset is data/VOCdevkit/VOC2007
and data/VOCdevkit/VOC2012
.
# specify a directory for dataset to be downloaded into, else default is ~/data/
sh data/scripts/VOC2007.sh # <directory>
# specify a directory for dataset to be downloaded into, else default is ~/data/
sh data/scripts/VOC2012.sh # <directory>
I copy the download files from the following excellent project: https://github.com/DeNA/PyTorch_YOLOv3
Just run sh data/scripts/COCO2017.sh
. You will get COCO train2017, val2017, test2017.
python train.py -d voc --cuda -v [select a model] -hr -ms --ema
You can run python train.py -h
to check all optional argument.
If you have only one gpu:
python train.py -d coco --cuda -v [select a model] -hr -ms --ema
If you have multi gpus like 8, and you put 4 images on each gpu:
python -m torch.distributed.launch --nproc_per_node=8 train.py -d coco --cuda -v [select a model] -hr -ms --ema \
-dist \
--sybn \
--num_gpu 8\
--batch_size 4
python test.py -d voc --cuda -v [select a model] --trained_model [ Please input the path to model dir. ]
python test.py -d coco-val --cuda -v [select a model] --trained_model [ Please input the path to model dir. ]
python eval.py -d voc --cuda -v [select a model] --train_model [ Please input the path to model dir. ]
To run on COCO_val:
python eval.py -d coco-val --cuda -v [select a model] --train_model [ Please input the path to model dir. ]
To run on COCO_test-dev(You must be sure that you have downloaded test2017):
python eval.py -d coco-test --cuda -v [select a model] --train_model [ Please input the path to model dir. ]
You will get a .json file which can be evaluated on COCO test server.