2019-02-13 23:15:30 +02:00
< table style = "width:100%" >
< tr >
2019-04-15 14:45:43 +02:00
< td >
2019-07-21 14:28:02 +02:00
< img src = "https://user-images.githubusercontent.com/26833433/61591130-f7beea00-abc2-11e9-9dc0-d6abcf41d713.jpg" >
2019-04-15 14:45:43 +02:00
< / td >
< td align = "center" >
< a href = "https://www.ultralytics.com" target = "_blank" >
2019-07-28 15:57:01 +02:00
< img src = "https://storage.googleapis.com/ultralytics/logo/logoname1000.png" width = "160" > < / a >
2019-07-21 14:28:02 +02:00
< img src = "https://user-images.githubusercontent.com/26833433/61591093-2b4d4480-abc2-11e9-8b46-d88eb1dabba1.jpg" >
< a href = "https://itunes.apple.com/app/id1452689527" target = "_blank" >
2019-04-15 14:45:43 +02:00
< img src = "https://user-images.githubusercontent.com/26833433/50044365-9b22ac00-0082-11e9-862f-e77aee7aa7b0.png" width = "180" > < / a >
< / td >
< td >
2019-07-21 14:28:02 +02:00
< img src = "https://user-images.githubusercontent.com/26833433/61591100-55066b80-abc2-11e9-9647-52c0e045b288.jpg" >
2019-04-15 14:45:43 +02:00
< / td >
2019-02-13 23:15:30 +02:00
< / tr >
< / table >
2019-02-13 23:01:58 +02:00
2019-04-26 12:01:43 +02:00
2020-06-10 16:45:09 -07:00
## Introduction
2018-08-26 10:51:39 +02:00
2019-03-28 13:46:23 +01:00
The https://github.com/ultralytics/yolov3 repo contains inference and training code for YOLOv3 in PyTorch. The code works on Linux, MacOS and Windows. Training is done on the COCO dataset by default: https://cocodataset.org/#home . **Credit to Joseph Redmon for YOLO:** https://pjreddie.com/darknet/yolo/.
2018-08-26 10:51:39 +02:00
2020-06-10 16:45:09 -07:00
## Requirements
Python 3.7 or later with all `requirements.txt` dependencies installed, including `torch >= 1.5` . To install run:
```bash
$ pip install -U -r requirements.txt
```
2020-01-09 09:59:53 -08:00
2020-06-10 16:45:09 -07:00
## Tutorials
2019-03-05 16:23:33 +01:00
2020-06-10 16:45:09 -07:00
* < a href = "https://colab.research.google.com/github/ultralytics/yolov3/blob/master/tutorial.ipynb" >< img src = "https://colab.research.google.com/assets/colab-badge.svg" alt = "Open In Colab" ></ a >
2020-04-01 12:16:37 -07:00
* [Train Custom Data ](https://github.com/ultralytics/yolov3/wiki/Train-Custom-Data ) < highly recommended !!
2020-04-01 12:12:14 -07:00
* [GCP Quickstart ](https://github.com/ultralytics/yolov3/wiki/GCP-Quickstart )
* [Docker Quickstart Guide ](https://github.com/ultralytics/yolov3/wiki/Docker-Quickstart )
2020-05-02 11:09:09 -07:00
* [A TensorRT Implementation of YOLOv3 and YOLOv4 ](https://github.com/wang-xinyu/tensorrtx/tree/master/yolov3-spp )
2019-05-28 16:14:37 +02:00
2020-06-10 16:45:09 -07:00
## Training
2018-08-26 10:51:39 +02:00
2020-04-01 12:12:14 -07:00
**Start Training:** `python3 train.py` to begin training after downloading COCO data with `data/get_coco2017.sh` . Each epoch trains on 117,263 images from the train and validate COCO sets, and tests on 5000 images from the COCO validate set.
2018-09-01 18:35:28 +02:00
2019-07-15 17:54:31 +02:00
**Resume Training:** `python3 train.py --resume` to resume training from `weights/last.pt` .
2018-09-01 18:35:28 +02:00
2020-04-01 12:12:14 -07:00
**Plot Training:** `from utils import utils; utils.plot_results()`
2019-09-09 21:33:54 +02:00
2020-04-01 12:12:14 -07:00
< img src = "https://user-images.githubusercontent.com/26833433/78175826-599d4800-7410-11ea-87d4-f629071838f6.png" width = "900" >
2018-09-01 13:34:05 +02:00
2020-06-10 16:45:09 -07:00
### Image Augmentation
2018-09-01 13:34:05 +02:00
2020-04-30 16:50:58 -07:00
`datasets.py` applies OpenCV-powered (https://opencv.org/) augmentation to the input image. We use a **mosaic dataloader** to increase image variability during training.
2018-09-01 13:34:05 +02:00
2020-04-30 16:50:58 -07:00
< img src = "https://user-images.githubusercontent.com/26833433/80769557-6e015d00-8b02-11ea-9c4b-69310eb2b962.jpg" width = "900" >
2018-08-26 10:51:39 +02:00
2020-06-10 16:45:09 -07:00
### Speed
2019-03-20 13:35:39 +02:00
https://cloud.google.com/deep-learning-vm/
2020-05-02 10:23:40 -07:00
**Machine type:** preemptible [n1-standard-8 ](https://cloud.google.com/compute/docs/machine-types ) (8 vCPUs, 30 GB memory)
2019-03-20 13:35:39 +02:00
**CPU platform:** Intel Skylake
2020-04-27 15:06:26 -07:00
**GPUs:** K80 ($0.14/hr), T4 ($0.11/hr), V100 ($0.74/hr) CUDA with [Nvidia Apex ](https://github.com/NVIDIA/apex ) FP16/32
2020-05-12 08:31:36 -07:00
**HDD:** 300 GB SSD
2019-11-30 15:32:39 -08:00
**Dataset:** COCO train 2014 (117,263 images)
2019-12-08 18:30:36 -08:00
**Model:** `yolov3-spp.cfg`
2020-05-02 10:23:40 -07:00
**Command:** `python3 train.py --data coco2017.data --img 416 --batch 32`
2019-03-25 14:59:38 +01:00
2020-05-02 10:23:40 -07:00
GPU | n | `--batch-size` | img/s | epoch< br > time | epoch< br > cost
2019-12-08 19:22:33 -08:00
--- |--- |--- |--- |--- |---
2020-04-27 15:06:26 -07:00
K80 |1| 32 x 2 | 11 | 175 min | $0.41
T4 |1< br > 2| 32 x 2< br > 64 x 1 | 41< br > 61 | 48 min< br > 32 min | $0.09< br > $0.11
V100 |1< br > 2| 32 x 2< br > 64 x 1 | 122< br > **178** | 16 min< br > **11 min** | ** $0.21**< br > $0.28
2019-12-08 19:22:33 -08:00
2080Ti |1< br > 2| 32 x 2< br > 64 x 1 | 81< br > 140 | 24 min< br > 14 min | -< br > -
2019-03-20 13:35:39 +02:00
2020-06-10 16:45:09 -07:00
2018-08-26 11:05:13 +02:00
# Inference
2019-02-11 14:13:27 +01:00
2019-08-31 20:34:14 +02:00
```bash
python3 detect.py --source ...
```
2019-08-31 20:35:21 +02:00
- Image: `--source file.jpg`
- Video: `--source file.mp4`
2019-08-31 20:34:14 +02:00
- Directory: `--source dir/`
- Webcam: `--source 0`
- RTSP stream: `--source rtsp://170.93.143.139/rtplive/470011e600ef003a004ee33696235daa`
2020-05-18 12:03:14 -07:00
- HTTP stream: `--source http://112.50.243.8/PLTV/88888888/224/3221225900/1.m3u8`
2019-08-31 20:34:14 +02:00
2020-04-01 12:16:37 -07:00
**YOLOv3:** `python3 detect.py --cfg cfg/yolov3.cfg --weights yolov3.pt`
2019-08-31 20:40:27 +02:00
< img src = "https://user-images.githubusercontent.com/26833433/64067835-51d5b500-cc2f-11e9-982e-843f7f9a6ea2.jpg" width = "500" >
2018-12-22 13:05:52 +01:00
2020-04-01 12:16:37 -07:00
**YOLOv3-tiny:** `python3 detect.py --cfg cfg/yolov3-tiny.cfg --weights yolov3-tiny.pt`
2019-08-31 20:40:27 +02:00
< img src = "https://user-images.githubusercontent.com/26833433/64067834-51d5b500-cc2f-11e9-9357-c485b159a20b.jpg" width = "500" >
2019-03-21 13:00:24 +02:00
2020-04-01 12:16:37 -07:00
**YOLOv3-SPP:** `python3 detect.py --cfg cfg/yolov3-spp.cfg --weights yolov3-spp.pt`
2019-08-31 20:40:27 +02:00
< img src = "https://user-images.githubusercontent.com/26833433/64067833-51d5b500-cc2f-11e9-8208-6fe197809131.jpg" width = "500" >
2019-02-11 14:11:24 +01:00
2020-06-10 16:45:09 -07:00
## Pretrained Checkpoints
2018-12-22 12:58:59 +01:00
2019-11-22 14:06:16 -10:00
Download from: [https://drive.google.com/open?id=1LezFG5g3BCW6iYaV89B2i64cqEUZD7e0 ](https://drive.google.com/open?id=1LezFG5g3BCW6iYaV89B2i64cqEUZD7e0 )
2018-09-01 18:48:53 +02:00
2020-06-10 16:45:09 -07:00
2019-04-23 17:05:42 +02:00
## Darknet Conversion
```bash
2019-10-16 01:32:07 +02:00
$ git clone https://github.com/ultralytics/yolov3 & & cd yolov3
2019-04-23 17:05:42 +02:00
# convert darknet cfg/weights to pytorch model
2019-10-16 01:32:07 +02:00
$ python3 -c "from models import *; convert('cfg/yolov3-spp.cfg', 'weights/yolov3-spp.weights')"
2020-05-13 19:08:55 +03:00
Success: converted 'weights/yolov3-spp.weights' to 'weights/yolov3-spp.pt'
2019-04-23 17:05:42 +02:00
# convert cfg/pytorch model to darknet weights
2019-10-16 01:32:07 +02:00
$ python3 -c "from models import *; convert('cfg/yolov3-spp.cfg', 'weights/yolov3-spp.pt')"
2020-05-13 19:08:55 +03:00
Success: converted 'weights/yolov3-spp.pt' to 'weights/yolov3-spp.weights'
2019-04-23 17:05:42 +02:00
```
2020-06-10 16:45:09 -07:00
## mAP
2019-03-20 13:26:46 +02:00
2019-11-30 15:34:57 -08:00
< i ></ i > |Size |COCO mAP< br > @0 .5...0.95 |COCO mAP< br > @0 .5
2019-11-26 12:59:13 -10:00
--- | --- | --- | ---
2020-04-05 17:18:24 -07:00
YOLOv3-tiny< br > YOLOv3< br > YOLOv3-SPP< br > **[YOLOv3-SPP-ultralytics ](https://drive.google.com/open?id=1UcR-zVoMs7DH5dj3N1bswkiQTA4dmKF4 )** |320 |14.0< br > 28.7< br > 30.5< br > **37.7** |29.1< br > 51.8< br > 52.3< br > **56.8**
YOLOv3-tiny< br > YOLOv3< br > YOLOv3-SPP< br > **[YOLOv3-SPP-ultralytics ](https://drive.google.com/open?id=1UcR-zVoMs7DH5dj3N1bswkiQTA4dmKF4 )** |416 |16.0< br > 31.2< br > 33.9< br > **41.2** |33.0< br > 55.4< br > 56.9< br > **60.6**
YOLOv3-tiny< br > YOLOv3< br > YOLOv3-SPP< br > **[YOLOv3-SPP-ultralytics ](https://drive.google.com/open?id=1UcR-zVoMs7DH5dj3N1bswkiQTA4dmKF4 )** |512 |16.6< br > 32.7< br > 35.6< br > **42.6** |34.9< br > 57.7< br > 59.5< br > **62.4**
YOLOv3-tiny< br > YOLOv3< br > YOLOv3-SPP< br > **[YOLOv3-SPP-ultralytics ](https://drive.google.com/open?id=1UcR-zVoMs7DH5dj3N1bswkiQTA4dmKF4 )** |608 |16.6< br > 33.1< br > 37.0< br > **43.1** |35.4< br > 58.2< br > 60.7< br > **62.8**
2019-12-26 12:31:30 -08:00
2020-03-28 16:03:46 -07:00
- mAP@0 .5 run at `--iou-thr 0.5` , mAP@0 .5...0.95 run at `--iou-thr 0.7`
- Darknet results: https://arxiv.org/abs/1804.02767
2019-08-31 20:34:14 +02:00
```bash
2020-03-26 16:35:46 -07:00
$ python3 test.py --cfg yolov3-spp.cfg --weights yolov3-spp-ultralytics.pt --img 640 --augment
2020-02-21 17:16:34 -08:00
2020-03-27 13:52:07 -07:00
Namespace(augment=True, batch_size=16, cfg='cfg/yolov3-spp.cfg', conf_thres=0.001, data='coco2014.data', device='', img_size=640, iou_thres=0.6, save_json=True, single_cls=False, task='test', weights='weight
2020-03-08 11:52:35 -07:00
Using CUDA device0 _CudaDeviceProperties(name='Tesla V100-SXM2-16GB', total_memory=16130MB)
2020-02-21 17:16:34 -08:00
2020-03-26 16:22:58 -07:00
Class Images Targets P R mAP@0 .5 F1: 100%|█████████| 313/313 [03:00< 00:00 , 1 . 74it / s ]
2020-04-08 10:02:20 -07:00
all 5e+03 3.51e+04 0.375 0.743 0.64 0.492
2020-04-07 12:27:49 -07:00
2020-04-15 12:25:42 -07:00
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.456
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.647
2020-04-07 12:27:49 -07:00
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.496
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.263
2020-04-08 10:02:20 -07:00
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.501
2020-04-07 12:27:49 -07:00
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.596
2020-04-08 10:02:20 -07:00
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.361
2020-04-07 12:27:49 -07:00
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.597
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.666
2020-04-08 10:02:20 -07:00
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.492
2020-04-07 12:27:49 -07:00
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.719
2020-04-08 10:02:20 -07:00
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.810
2020-03-27 13:52:07 -07:00
2020-04-08 20:53:17 -07:00
Speed: 17.5/2.3/19.9 ms inference/NMS/total per 640x640 image at batch-size 16
2019-03-20 13:26:46 +02:00
```
2020-04-08 20:53:17 -07:00
<!-- Speed: 11.4/2.2/13.6 ms inference/NMS/total per 608x608 image at batch - size 1 -->
2018-08-26 10:51:39 +02:00
2020-06-10 16:45:09 -07:00
## Reproduce Our Results
2019-12-11 13:21:39 -08:00
2020-05-02 18:44:31 -07:00
Run commands below. Training takes about one week on a 2080Ti per model.
2019-12-11 13:21:39 -08:00
```bash
2020-05-02 18:44:31 -07:00
$ python train.py --data coco2014.data --weights '' --batch-size 16 --cfg yolov3-spp.cfg
$ python train.py --data coco2014.data --weights '' --batch-size 32 --cfg yolov3-tiny.cfg
2019-12-11 13:21:39 -08:00
```
2020-05-02 18:44:31 -07:00
< img src = "https://user-images.githubusercontent.com/26833433/80831822-57a9de80-8ba0-11ea-9684-c47afb0432dc.png" width = "900" >
2019-12-11 13:21:39 -08:00
2020-06-10 16:45:09 -07:00
## Reproduce Our Environment
2019-12-11 13:40:11 -08:00
To access an up-to-date working environment (with all dependencies including CUDA/CUDNN, Python and PyTorch preinstalled), consider a:
- **GCP** Deep Learning VM with $300 free credit offer: See our [GCP Quickstart Guide ](https://github.com/ultralytics/yolov3/wiki/GCP-Quickstart )
2020-06-10 16:45:09 -07:00
- **Google Colab Notebook** with 12 hours of free GPU time. < a href = "https://colab.research.google.com/github/ultralytics/yolov3/blob/master/tutorial.ipynb" >< img src = "https://colab.research.google.com/assets/colab-badge.svg" alt = "Open In Colab" ></ a >
- **Docker Image** https://hub.docker.com/r/ultralytics/yolov5. See [Docker Quickstart Guide ](https://github.com/ultralytics/yolov3/wiki/Docker-Quickstart )
2019-04-03 12:42:40 +02:00
# Citation
[](https://zenodo.org/badge/latestdoi/146165888)
2018-08-26 10:51:39 +02:00
2020-06-10 16:45:09 -07:00
## About Us
Ultralytics is a U.S.-based particle physics and AI startup with over 6 years of expertise supporting government, academic and business clients. We offer a wide range of vision AI services, spanning from simple expert advice up to delivery of fully customized, end-to-end production solutions, including:
- **Cloud-based AI** surveillance systems operating on **hundreds of HD video streams in realtime.**
- **Edge AI** integrated into custom iOS and Android apps for realtime **30 FPS video inference.**
- **Custom data training**, hyperparameter evolution, and model exportation to any destination.
For business inquiries and professional support requests please visit us at https://www.ultralytics.com.
## Contact
**Issues should be raised directly in the repository.** For business inquiries or professional support requests please visit https://www.ultralytics.com or email Glenn Jocher at glenn.jocher@ultralytics .com.