Recently, I'm trying to optimize this project. Maybe about one or more weeks, I will upload the newest results and provide a better version of train, test, eval codes.
I wish this version of yolo can help everyone who is interested in Object Detection.
I am trying to build a better YOLOv3 with SPP, PAN and more other modules and tricks.
https://github.com/yjh0410/yolov3-plus_PyTorch
I sincerely recommend everyone to use my new project. It is better~
In this project, you can enjoy:
- YOLOv2
- YOLOv3
- YOLOv3Spp
- SlimYOLOv2
- TinyYOLOv3
What I have to say is that I don't try to 100% reproduce the whole official YOLO project, because it is really hard to me. I have not much computation resource, so I can't train my yolov3 on COCO. It will cost more than two weeks...
Recently, I made some improvement, and my yolo project is very close to official yolo models.
I will upload the new model again. Just hold on~
However, I have a qeustion: Is the mAP metric really good? Does it really suit object detection?
I find higher mAP doesn't mean better visualization...so weird.
For backbone, I provide the link to download them in backbone\weights\README.md
.
For detectors, you can find the link to download them in weights\README.md
.
Tricks in official paper:
- batch norm
- hi-res classifier
- convolutional
- anchor boxes
- new network
- dimension priors
- location prediction
- passthrough
- multi-scale
- hi-red detector
First of all, I reproduce the backbone darknet19 on ImageNet.
size | Original (darknet) | Ours (pytorch) | |
darknet19 | 224 | 72.9 | 72.96 |
darknet19 | 448 | 76.5 | 75.52 |
Not bad, right?
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 |
I train my YOLOv2 with 250 epochs on COCO. From the above table, my YOLOv2 is better, right?
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.
First of all, I try to reproduce darknet53 on ImageNet:
size | Original (darknet) | Ours (pytorch) | |
darknet53 | 224 | 77.2 | 75.42 |
darknet53 | 448 | - | 77.76 |
Not so bad, right?
Then, 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 TinyYOLOv3 on COCO-val with inputsize 608:
data | AP | AP50 | AP75 | AP_S | AP_M | AP_L | |
(official) TinyYOLOv3 | COCO test-dev | - | 33.1 | - | - | - | - |
(Our) TinyYOLOv3 | 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
You can run python train.py -h
to check all optional argument.
python train.py -d coco --cuda -v [select a model] -hr -ms
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.