├── .gitignore ├── LICENSE ├── README.md ├── cfg ├── yolov4-crowdhuman-416x416.cfg ├── yolov4-crowdhuman-480x480.cfg ├── yolov4-crowdhuman-608x608.cfg ├── yolov4-tiny-3l-crowdhuman-416x416.cfg ├── yolov4-tiny-3l-crowdhuman-608x608.cfg ├── yolov4-tiny-crowdhuman-416x416.cfg └── yolov4-tiny-crowdhuman-608x608.cfg ├── data ├── README.md ├── crowdhuman-template.data ├── crowdhuman.names ├── gen_txts.py ├── image_histogram.ipynb ├── prepare_data.sh └── verify_txts.py ├── doc ├── cant_connect_gpu.jpg ├── chart_yolov4-crowdhuman-608x608.png ├── chart_yolov4-tiny-3l-crowdhuman-416x416.png ├── chart_yolov4-tiny-crowdhuman-608x608.png ├── crowdhuman_sample.jpg ├── drive_on_colab.jpg ├── infinity_war.jpg ├── predictions_sample.jpg └── save_a_copy.jpg ├── prepare_training.sh └── yolov4_crowdhuman.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | *.pyc 3 | 4 | data/raw/ 5 | data/crowdhuman*/ 6 | data/crowdhuman-*.data 7 | data/.ipynb_checkpoints/ 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 JK Jung 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | YOLOv4 CrowdHuman Tutorial 2 | ========================== 3 | 4 | This is a tutorial demonstrating how to train a YOLOv4 people detector using [Darknet](https://github.com/AlexeyAB/darknet) and the [CrowdHuman dataset](https://www.crowdhuman.org/). 5 | 6 | Table of contents 7 | ----------------- 8 | 9 | * [Setup](#setup) 10 | * [Preparing training data](#preparing) 11 | * [Training on a local PC](#training-locally) 12 | * [Testing the custom-trained yolov4 model](#testing) 13 | * [Training on Google Colab](#training-colab) 14 | * [Deploying onto Jetson Nano](#deploying) 15 | 16 | 17 | Setup 18 | ----- 19 | 20 | If you are going to train the model on [Google Colab](https://colab.research.google.com/notebooks/intro.ipynb), you could skip this section and jump straight to [Training on Google Colab](#training-colab). 21 | 22 | Otherwise, to run training locally, you need to have a x86_64 PC with a decent GPU. For example, I mainly test the code in this repository using a desktop PC with: 23 | 24 | * NVIDIA GeForce RTX 2080 Ti 25 | * Ubuntu 18.04.5 LTS (x86_64) 26 | - CUDA 10.2 27 | - cuDNN 8.0.1 28 | 29 | In addition, you should have OpenCV (including python3 "cv2" module) installed properly on the local PC since both the data preparation code and "darknet" would require it. 30 | 31 | 32 | Preparing training data 33 | ----------------------- 34 | 35 | For training on the local PC, I use a "608x608" yolov4 model as example. Note that I use python3 exclusively in this tutorial (python2 might not work). Follow these steps to prepare the "CrowdHuman" dataset for training the yolov4 model. 36 | 37 | 1. Clone this repository. 38 | 39 | ```shell 40 | $ cd ${HOME}/project 41 | $ git clone https://github.com/jkjung-avt/yolov4_crowdhuman 42 | ``` 43 | 44 | 2. Run the "prepare_data.sh" script in the "data/" subdirectory. It would download the "CrowdHuman" dataset, unzip train/val image files, and generate YOLO txt files necessary for the training. You could refer to [data/README.md](data/README.md) for more information about the dataset. You could further refer to [How to train (to detect your custom objects)](https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects) for an explanation of YOLO txt files. 45 | 46 | ```shell 47 | $ cd ${HOME}/project/yolov4_crowdhuman/data 48 | $ ./prepare_data.sh 608x608 49 | ``` 50 | 51 | This step could take quite a while, depending on your internet speed. When it is done, all image files and ".txt" files for training would be in the "data/crowdhuman-608x608/" subdirectory. (If interested, you could do `python3 verify_txts.py 608x608` to verify the generated txt files.) 52 | 53 | This tutorial is for training the yolov4 model to detect 2 classes of object: "head" (0) and "person" (1), where the "person" class corresponds to "full body" (including occluded body portions) in the original "CrowdHuman" annotations. Take a look at "data/crowdhuman-608x608.data", "data/crowdhuman.names", and "data/crowdhuman-608x608/" to gain a better understanding of the data files that have been generated/prepared for the training. 54 | 55 | ![A sample jpg from the CrowdHuman dataset](doc/crowdhuman_sample.jpg) 56 | 57 | 58 | Training on a local PC 59 | ---------------------- 60 | 61 | Continuing from steps in the previous section, you'd be using the "darknet" framework to train the yolov4 model. 62 | 63 | 1. Download and build "darknet" code. (NOTE to myself: Consider making "darknet" as a submodule and automate the build process?) 64 | 65 | ```shell 66 | $ cd ${HOME}/project/yolov4_crowdhuman 67 | $ git clone https://github.com/AlexeyAB/darknet.git 68 | $ cd darknet 69 | $ vim Makefile # edit Makefile with your preferred editor (might not be vim) 70 | ``` 71 | 72 | Modify the first few lines of the "Makefile" as follows. Please refer to [How to compile on Linux (using make)](https://github.com/AlexeyAB/darknet#how-to-compile-on-linux-using-make) for more information about these settings. Note that, in the example below, CUDA compute "75" is for RTX 2080 Ti and "61" is for GTX 1080. You might need to modify those based on the kind of GPU you are using. 73 | 74 | ``` 75 | GPU=1 76 | CUDNN=1 77 | CUDNN_HALF=1 78 | OPENCV=1 79 | AVX=1 80 | OPENMP=1 81 | LIBSO=1 82 | ZED_CAMERA=0 83 | ZED_CAMERA_v2_8=0 84 | 85 | ...... 86 | 87 | USE_CPP=0 88 | DEBUG=0 89 | 90 | ARCH= -gencode arch=compute_61,code=[sm_61,compute_61] \ 91 | -gencode arch=compute_75,code=[sm_75,compute_75] 92 | 93 | ...... 94 | ``` 95 | 96 | Then do a `make` to build "darknet". 97 | 98 | ```shell 99 | $ make 100 | ``` 101 | 102 | When it is done, you could (optionally) test the "darknet" executable as follows. 103 | 104 | ```shell 105 | ### download pre-trained yolov4 coco weights and test with the dog image 106 | $ wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights \ 107 | -q --show-progress --no-clobber 108 | $ ./darknet detector test cfg/coco.data cfg/yolov4-416.cfg yolov4.weights \ 109 | data/dog.jpg 110 | ``` 111 | 112 | 2. Then copy over all files needed for training and download the pre-trained weights ("yolov4.conv.137"). 113 | 114 | ```shell 115 | $ cd ${HOME}/project/yolov4_crowdhuman 116 | $ ./prepare_training.sh 608x608 117 | ``` 118 | 119 | 3. Train the "yolov4-crowdhuman-608x608" model. Please refer to [How to train with multi-GPU](https://github.com/AlexeyAB/darknet#how-to-train-with-multi-gpu) for how to fine-tune your training process. For example, you could specify `-gpus 0,1,2,3` in order to use multiple GPUs to speed up training. 120 | 121 | ```shell 122 | $ cd ${HOME}/project/yolov4_crowdhuman/darknet 123 | $ ./darknet detector train data/crowdhuman-608x608.data \ 124 | cfg/yolov4-crowdhuman-608x608.cfg \ 125 | yolov4.conv.137 -map -gpus 0 126 | ``` 127 | 128 | When the model is being trained, you could monitor its progress on the loss/mAP chart (since the `-map` option is used). Alternatively, if you are training on a remote PC via ssh, add the `-dont_show -mjpeg_port 8090` option so that you could monitor the loss/mAP chart on a web browser (http://{IP address}:8090/). 129 | 130 | As a reference, training this "yolov4-crowdhuman-608x608" model with my RTX 2080 Ti GPU takes 17~18 hours. 131 | 132 | ![My sample loss/mAP chart of the "yolov4-crowdhuman-608x608" model](doc/chart_yolov4-crowdhuman-608x608.png) 133 | 134 | Another example for the training of "yolov4-tiny-crowdhuman-608x608" model on RTX 2080 Ti GPU (< 3 hours). 135 | 136 | ![My sample loss/mAP chart of the "yolov4-tiny-crowdhuman-608x608" model](doc/chart_yolov4-tiny-crowdhuman-608x608.png) 137 | 138 | And another one for the training of "yolov4-tiny-3l-crowdhuman-416x416" model on RTX 2080 Ti GPU (< 2 hours). 139 | 140 | ![My sample loss/mAP chart of the "yolov4-tiny-3l-crowdhuman-416x416" model](doc/chart_yolov4-tiny-3l-crowdhuman-416x416.png) 141 | 142 | 143 | Testing the custom-trained yolov4 model 144 | --------------------------------------- 145 | 146 | After you have trained the "yolov4-crowdhuman-608x608" model locally, you could test the "best" custom-trained model like this. 147 | 148 | ```shell 149 | $ cd ${HOME}/project/yolov4_crowdhuman/darknet 150 | $ ./darknet detector test data/crowdhuman-608x608.data \ 151 | cfg/yolov4-crowdhuman-608x608.cfg \ 152 | backup/yolov4-crowdhuman-608x608_best.weights \ 153 | data/crowdhuman-608x608/273275,4e9d1000623d182f.jpg \ 154 | -gpus 0 155 | ``` 156 | 157 | ![A sample prediction using the trained "yolov4-crowdhuman-608x608" model](doc/predictions_sample.jpg) 158 | 159 | In addition, you could verify mAP of the "best" model like this. 160 | 161 | ``` 162 | $ ./darknet detector map data/crowdhuman-608x608.data \ 163 | cfg/yolov4-crowdhuman-608x608.cfg \ 164 | backup/yolov4-crowdhuman-608x608_best.weights \ 165 | -gpus 0 166 | ``` 167 | 168 | For example, I got mAP@0.50 = 0.814523 when I tested my own custom-trained "yolov4-crowdhuman-608x608" model. 169 | 170 | ``` 171 | detections_count = 614280, unique_truth_count = 183365 172 | class_id = 0, name = head, ap = 82.60% (TP = 65119, FP = 14590) 173 | class_id = 1, name = person, ap = 80.30% (TP = 72055, FP = 11766) 174 | 175 | for conf_thresh = 0.25, precision = 0.84, recall = 0.75, F1-score = 0.79 176 | for conf_thresh = 0.25, TP = 137174, FP = 26356, FN = 46191, average IoU = 66.92 % 177 | 178 | IoU threshold = 50 %, used Area-Under-Curve for each unique Recall 179 | mean average precision (mAP@0.50) = 0.814523, or 81.45 % 180 | ``` 181 | 182 | 183 | Training on Google Colab 184 | ------------------------ 185 | 186 | For doing training on Google Colab, I use a "416x416" yolov4 model as example. I have put all data processing and training commands into an IPython Notebook. So training the "yolov4-crowdhuman-416x416" model on Google Colab is just as simple as: (1) opening the Notebook on Google Colab, (2) mount your Google Drive, (3) run all cells in the Notebook. 187 | 188 | A few words of caution before you begin running the Notebook on Google Colab: 189 | 190 | * Google Colab's GPU runtime is *free of charge*, but it is **not unlimited nor guaranteed**. Even though the Google Colab [FAQ](https://research.google.com/colaboratory/faq.html#resource-limits) states that *"virtual machines have maximum lifetimes that can be as much as 12 hours"*, I often saw my Colab GPU sessions getting disconnected after 7~8 hours of non-interactive use. 191 | 192 | * If you connect to GPU instances on Google Colab repeatedly and frequently, you could be **temporarily locked out** (not able to connect to GPU instances for a couple of days). So I'd suggest you to connect to a GPU runtime sparingly and only when needed, and to manually terminate the GPU sessions as soon as you no longer need them. 193 | 194 | * It is strongly advised that you read and mind Google Colab's [Resource Limits](https://research.google.com/colaboratory/faq.html#resource-limits). 195 | 196 | Due to the 7~8 hour limit of GPU runtime mentioned above, you won't be able to train a large yolov4 model in a single session. That's the reason why I chose "416x416" model for this part of the tutorial. Here are the steps: 197 | 198 | 1. Open [yolov4_crowdhuman.ipynb](https://colab.research.google.com/drive/1eoa2_v6wVlcJiDBh3Tb_umhm7a09lpIE?usp=sharing). This IPython Notebook is on my personal Google Drive. You could review it, but you could not modify it. 199 | 200 | 2. Make a copy of "yolov4_crowdhuman.ipynb" on your own Google Drive, by clicking "Files -> Save a copy in Drive" on the menu. You should use your own saved copy of the Notebook for the rest of the steps. 201 | 202 | ![Saving a copy of yolov4_crowdhuman.ipynb](./doc/save_a_copy.jpg) 203 | 204 | 3. Follow the instructions in the Notebook to train the "yolov4-crowdhuman-416x416" model, i.e. 205 | 206 | - make sure the IPython Notebook has successfully connected to a GPU runtime, 207 | - mount your Google Drive (for saving training log and weights), 208 | - run all cells ("Runtime -> Run all" or "Runtime -> Restart and run all"). 209 | 210 | You should have a good chance of finishing training the "yolov4-crowdhuman-416x416" model before the Colab session gets automatically disconnected (expired). 211 | 212 | Instead of opening the Colab Notebook on my Google Drive, you could also go to [your own Colab account](https://colab.research.google.com/notebooks/intro.ipynb) and use "File -> Upload notebook" to upload [yolov4_crowdhuman.ipynb](yolov4_crowdhuman.ipynb) directly. 213 | 214 | Refer to my [Custom YOLOv4 Model on Google Colab](https://jkjung-avt.github.io/colab-yolov4/) post for additional information about running the IPython Notebook. 215 | 216 | 217 | Deploying onto Jetson Nano 218 | -------------------------- 219 | 220 | To deploy the trained "yolov4-crowdhuman-416x416" model onto Jsetson Nano, I'd use my [jkjung-avt/tensorrt_demos](https://github.com/jkjung-avt/tensorrt_demos) code to build/deploy it as a TensorRT engine. Here are the detailed steps: 221 | 222 | 1. On the Jetson Nano, check out my [jkjung-avt/tensorrt_demos](https://github.com/jkjung-avt/tensorrt_demos) code and make sure you are able to run the standard "yolov4-416" TensorRT engine without problem. Please refer to [Demo #5: YOLOv4](https://github.com/jkjung-avt/tensorrt_demos#yolov4) for details. 223 | 224 | ```shell 225 | $ cd ${HOME}/project 226 | $ git clone https://github.com/jkjung-avt/tensorrt_demos.git 227 | ### Detailed steps omitted: install pycuda, download yolov4-416 model, yolo_to_onnx, onnx_to_tensorrt 228 | ### ...... 229 | $ cd ${HOME}/project/tensorrt_demos 230 | $ python3 trt_yolo.py --image ${HOME}/Pictures/dog.jpg -m yolov4-416 231 | ``` 232 | 233 | 2. Download the "yolov4-crowdhuman-416x416" model. More specifically, get "yolov4-crowdhuman-416x416.cfg" from this repository and download "yolov4-crowdhuman-416x416_best.weights" file from your Google Drive. Rename the .weights file so that it matches the .cfg file. 234 | 235 | ```shell 236 | $ cd ${HOME}/project/tensorrt_demos/yolo 237 | $ wget https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/master/cfg/yolov4-crowdhuman-416x416.cfg 238 | $ cp ${HOME}/Downloads/yolov4-crowdhuman-416x416_best.weights yolov4-crowdhuman-416x416.weights 239 | ``` 240 | 241 | Then build the TensorRT (FP16) engine. Note the "-c 2" in the command-line option is for specifying that the model is for detecting 2 classes of objects. 242 | 243 | ```shell 244 | $ python3 yolo_to_onnx.py -c 2 -m yolov4-crowdhuman-416x416 245 | $ python3 onnx_to_tensorrt.py -c 2 -m yolov4-crowdhuman-416x416 246 | ``` 247 | 248 | 3. Test the TensorRT engine. For example, I tested it with the "Avengers: Infinity War" movie trailer. (You should download and test with your own images or videos.) 249 | 250 | ```shell 251 | $ cd ${HOME}/project/tensorrt_demos 252 | $ python3 trt_yolo.py --video ${HOME}/Videos/Infinity_War.mp4 \ 253 | -c 2 -m yolov4-crowdhuman-416x416 254 | ``` 255 | 256 | (Click on the image below to see the whole video clip...) 257 | 258 | [![Testing with the Avengers: Infinity War trailer](https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/master/doc/infinity_war.jpg)](https://youtu.be/7Qr_Fq18FgM) 259 | 260 | 261 | Contributions 262 | -------------------------- 263 | 264 | [@philipp-schmidt](https://github.com/philipp-schmidt): yolov4-tiny models and training charts -------------------------------------------------------------------------------- /cfg/yolov4-crowdhuman-416x416.cfg: -------------------------------------------------------------------------------- 1 | [net] 2 | # Training 3 | batch=24 4 | subdivisions=8 5 | # Testing 6 | #batch=1 7 | #subdivisions=1 8 | width=416 9 | height=416 10 | channels=3 11 | momentum=0.949 12 | decay=0.0005 13 | angle=0 14 | saturation = 1.5 15 | exposure = 1.5 16 | hue=.1 17 | 18 | learning_rate=0.001 19 | burn_in=1000 20 | max_batches=4000 21 | policy=steps 22 | steps=3000,3600 23 | scales=.1,.1 24 | 25 | max_chart_loss=40.0 26 | 27 | #cutmix=1 28 | mosaic=1 29 | 30 | #:104x104 54:52x52 85:26x26 104:13x13 for 416 31 | 32 | [convolutional] 33 | batch_normalize=1 34 | filters=32 35 | size=3 36 | stride=1 37 | pad=1 38 | activation=mish 39 | 40 | # Downsample 41 | 42 | [convolutional] 43 | batch_normalize=1 44 | filters=64 45 | size=3 46 | stride=2 47 | pad=1 48 | activation=mish 49 | 50 | [convolutional] 51 | batch_normalize=1 52 | filters=64 53 | size=1 54 | stride=1 55 | pad=1 56 | activation=mish 57 | 58 | [route] 59 | layers = -2 60 | 61 | [convolutional] 62 | batch_normalize=1 63 | filters=64 64 | size=1 65 | stride=1 66 | pad=1 67 | activation=mish 68 | 69 | [convolutional] 70 | batch_normalize=1 71 | filters=32 72 | size=1 73 | stride=1 74 | pad=1 75 | activation=mish 76 | 77 | [convolutional] 78 | batch_normalize=1 79 | filters=64 80 | size=3 81 | stride=1 82 | pad=1 83 | activation=mish 84 | 85 | [shortcut] 86 | from=-3 87 | activation=linear 88 | 89 | [convolutional] 90 | batch_normalize=1 91 | filters=64 92 | size=1 93 | stride=1 94 | pad=1 95 | activation=mish 96 | 97 | [route] 98 | layers = -1,-7 99 | 100 | [convolutional] 101 | batch_normalize=1 102 | filters=64 103 | size=1 104 | stride=1 105 | pad=1 106 | activation=mish 107 | 108 | # Downsample 109 | 110 | [convolutional] 111 | batch_normalize=1 112 | filters=128 113 | size=3 114 | stride=2 115 | pad=1 116 | activation=mish 117 | 118 | [convolutional] 119 | batch_normalize=1 120 | filters=64 121 | size=1 122 | stride=1 123 | pad=1 124 | activation=mish 125 | 126 | [route] 127 | layers = -2 128 | 129 | [convolutional] 130 | batch_normalize=1 131 | filters=64 132 | size=1 133 | stride=1 134 | pad=1 135 | activation=mish 136 | 137 | [convolutional] 138 | batch_normalize=1 139 | filters=64 140 | size=1 141 | stride=1 142 | pad=1 143 | activation=mish 144 | 145 | [convolutional] 146 | batch_normalize=1 147 | filters=64 148 | size=3 149 | stride=1 150 | pad=1 151 | activation=mish 152 | 153 | [shortcut] 154 | from=-3 155 | activation=linear 156 | 157 | [convolutional] 158 | batch_normalize=1 159 | filters=64 160 | size=1 161 | stride=1 162 | pad=1 163 | activation=mish 164 | 165 | [convolutional] 166 | batch_normalize=1 167 | filters=64 168 | size=3 169 | stride=1 170 | pad=1 171 | activation=mish 172 | 173 | [shortcut] 174 | from=-3 175 | activation=linear 176 | 177 | [convolutional] 178 | batch_normalize=1 179 | filters=64 180 | size=1 181 | stride=1 182 | pad=1 183 | activation=mish 184 | 185 | [route] 186 | layers = -1,-10 187 | 188 | [convolutional] 189 | batch_normalize=1 190 | filters=128 191 | size=1 192 | stride=1 193 | pad=1 194 | activation=mish 195 | 196 | # Downsample 197 | 198 | [convolutional] 199 | batch_normalize=1 200 | filters=256 201 | size=3 202 | stride=2 203 | pad=1 204 | activation=mish 205 | 206 | [convolutional] 207 | batch_normalize=1 208 | filters=128 209 | size=1 210 | stride=1 211 | pad=1 212 | activation=mish 213 | 214 | [route] 215 | layers = -2 216 | 217 | [convolutional] 218 | batch_normalize=1 219 | filters=128 220 | size=1 221 | stride=1 222 | pad=1 223 | activation=mish 224 | 225 | [convolutional] 226 | batch_normalize=1 227 | filters=128 228 | size=1 229 | stride=1 230 | pad=1 231 | activation=mish 232 | 233 | [convolutional] 234 | batch_normalize=1 235 | filters=128 236 | size=3 237 | stride=1 238 | pad=1 239 | activation=mish 240 | 241 | [shortcut] 242 | from=-3 243 | activation=linear 244 | 245 | [convolutional] 246 | batch_normalize=1 247 | filters=128 248 | size=1 249 | stride=1 250 | pad=1 251 | activation=mish 252 | 253 | [convolutional] 254 | batch_normalize=1 255 | filters=128 256 | size=3 257 | stride=1 258 | pad=1 259 | activation=mish 260 | 261 | [shortcut] 262 | from=-3 263 | activation=linear 264 | 265 | [convolutional] 266 | batch_normalize=1 267 | filters=128 268 | size=1 269 | stride=1 270 | pad=1 271 | activation=mish 272 | 273 | [convolutional] 274 | batch_normalize=1 275 | filters=128 276 | size=3 277 | stride=1 278 | pad=1 279 | activation=mish 280 | 281 | [shortcut] 282 | from=-3 283 | activation=linear 284 | 285 | [convolutional] 286 | batch_normalize=1 287 | filters=128 288 | size=1 289 | stride=1 290 | pad=1 291 | activation=mish 292 | 293 | [convolutional] 294 | batch_normalize=1 295 | filters=128 296 | size=3 297 | stride=1 298 | pad=1 299 | activation=mish 300 | 301 | [shortcut] 302 | from=-3 303 | activation=linear 304 | 305 | 306 | [convolutional] 307 | batch_normalize=1 308 | filters=128 309 | size=1 310 | stride=1 311 | pad=1 312 | activation=mish 313 | 314 | [convolutional] 315 | batch_normalize=1 316 | filters=128 317 | size=3 318 | stride=1 319 | pad=1 320 | activation=mish 321 | 322 | [shortcut] 323 | from=-3 324 | activation=linear 325 | 326 | [convolutional] 327 | batch_normalize=1 328 | filters=128 329 | size=1 330 | stride=1 331 | pad=1 332 | activation=mish 333 | 334 | [convolutional] 335 | batch_normalize=1 336 | filters=128 337 | size=3 338 | stride=1 339 | pad=1 340 | activation=mish 341 | 342 | [shortcut] 343 | from=-3 344 | activation=linear 345 | 346 | [convolutional] 347 | batch_normalize=1 348 | filters=128 349 | size=1 350 | stride=1 351 | pad=1 352 | activation=mish 353 | 354 | [convolutional] 355 | batch_normalize=1 356 | filters=128 357 | size=3 358 | stride=1 359 | pad=1 360 | activation=mish 361 | 362 | [shortcut] 363 | from=-3 364 | activation=linear 365 | 366 | [convolutional] 367 | batch_normalize=1 368 | filters=128 369 | size=1 370 | stride=1 371 | pad=1 372 | activation=mish 373 | 374 | [convolutional] 375 | batch_normalize=1 376 | filters=128 377 | size=3 378 | stride=1 379 | pad=1 380 | activation=mish 381 | 382 | [shortcut] 383 | from=-3 384 | activation=linear 385 | 386 | [convolutional] 387 | batch_normalize=1 388 | filters=128 389 | size=1 390 | stride=1 391 | pad=1 392 | activation=mish 393 | 394 | [route] 395 | layers = -1,-28 396 | 397 | [convolutional] 398 | batch_normalize=1 399 | filters=256 400 | size=1 401 | stride=1 402 | pad=1 403 | activation=mish 404 | 405 | # Downsample 406 | 407 | [convolutional] 408 | batch_normalize=1 409 | filters=512 410 | size=3 411 | stride=2 412 | pad=1 413 | activation=mish 414 | 415 | [convolutional] 416 | batch_normalize=1 417 | filters=256 418 | size=1 419 | stride=1 420 | pad=1 421 | activation=mish 422 | 423 | [route] 424 | layers = -2 425 | 426 | [convolutional] 427 | batch_normalize=1 428 | filters=256 429 | size=1 430 | stride=1 431 | pad=1 432 | activation=mish 433 | 434 | [convolutional] 435 | batch_normalize=1 436 | filters=256 437 | size=1 438 | stride=1 439 | pad=1 440 | activation=mish 441 | 442 | [convolutional] 443 | batch_normalize=1 444 | filters=256 445 | size=3 446 | stride=1 447 | pad=1 448 | activation=mish 449 | 450 | [shortcut] 451 | from=-3 452 | activation=linear 453 | 454 | 455 | [convolutional] 456 | batch_normalize=1 457 | filters=256 458 | size=1 459 | stride=1 460 | pad=1 461 | activation=mish 462 | 463 | [convolutional] 464 | batch_normalize=1 465 | filters=256 466 | size=3 467 | stride=1 468 | pad=1 469 | activation=mish 470 | 471 | [shortcut] 472 | from=-3 473 | activation=linear 474 | 475 | 476 | [convolutional] 477 | batch_normalize=1 478 | filters=256 479 | size=1 480 | stride=1 481 | pad=1 482 | activation=mish 483 | 484 | [convolutional] 485 | batch_normalize=1 486 | filters=256 487 | size=3 488 | stride=1 489 | pad=1 490 | activation=mish 491 | 492 | [shortcut] 493 | from=-3 494 | activation=linear 495 | 496 | 497 | [convolutional] 498 | batch_normalize=1 499 | filters=256 500 | size=1 501 | stride=1 502 | pad=1 503 | activation=mish 504 | 505 | [convolutional] 506 | batch_normalize=1 507 | filters=256 508 | size=3 509 | stride=1 510 | pad=1 511 | activation=mish 512 | 513 | [shortcut] 514 | from=-3 515 | activation=linear 516 | 517 | 518 | [convolutional] 519 | batch_normalize=1 520 | filters=256 521 | size=1 522 | stride=1 523 | pad=1 524 | activation=mish 525 | 526 | [convolutional] 527 | batch_normalize=1 528 | filters=256 529 | size=3 530 | stride=1 531 | pad=1 532 | activation=mish 533 | 534 | [shortcut] 535 | from=-3 536 | activation=linear 537 | 538 | 539 | [convolutional] 540 | batch_normalize=1 541 | filters=256 542 | size=1 543 | stride=1 544 | pad=1 545 | activation=mish 546 | 547 | [convolutional] 548 | batch_normalize=1 549 | filters=256 550 | size=3 551 | stride=1 552 | pad=1 553 | activation=mish 554 | 555 | [shortcut] 556 | from=-3 557 | activation=linear 558 | 559 | 560 | [convolutional] 561 | batch_normalize=1 562 | filters=256 563 | size=1 564 | stride=1 565 | pad=1 566 | activation=mish 567 | 568 | [convolutional] 569 | batch_normalize=1 570 | filters=256 571 | size=3 572 | stride=1 573 | pad=1 574 | activation=mish 575 | 576 | [shortcut] 577 | from=-3 578 | activation=linear 579 | 580 | [convolutional] 581 | batch_normalize=1 582 | filters=256 583 | size=1 584 | stride=1 585 | pad=1 586 | activation=mish 587 | 588 | [convolutional] 589 | batch_normalize=1 590 | filters=256 591 | size=3 592 | stride=1 593 | pad=1 594 | activation=mish 595 | 596 | [shortcut] 597 | from=-3 598 | activation=linear 599 | 600 | [convolutional] 601 | batch_normalize=1 602 | filters=256 603 | size=1 604 | stride=1 605 | pad=1 606 | activation=mish 607 | 608 | [route] 609 | layers = -1,-28 610 | 611 | [convolutional] 612 | batch_normalize=1 613 | filters=512 614 | size=1 615 | stride=1 616 | pad=1 617 | activation=mish 618 | 619 | # Downsample 620 | 621 | [convolutional] 622 | batch_normalize=1 623 | filters=1024 624 | size=3 625 | stride=2 626 | pad=1 627 | activation=mish 628 | 629 | [convolutional] 630 | batch_normalize=1 631 | filters=512 632 | size=1 633 | stride=1 634 | pad=1 635 | activation=mish 636 | 637 | [route] 638 | layers = -2 639 | 640 | [convolutional] 641 | batch_normalize=1 642 | filters=512 643 | size=1 644 | stride=1 645 | pad=1 646 | activation=mish 647 | 648 | [convolutional] 649 | batch_normalize=1 650 | filters=512 651 | size=1 652 | stride=1 653 | pad=1 654 | activation=mish 655 | 656 | [convolutional] 657 | batch_normalize=1 658 | filters=512 659 | size=3 660 | stride=1 661 | pad=1 662 | activation=mish 663 | 664 | [shortcut] 665 | from=-3 666 | activation=linear 667 | 668 | [convolutional] 669 | batch_normalize=1 670 | filters=512 671 | size=1 672 | stride=1 673 | pad=1 674 | activation=mish 675 | 676 | [convolutional] 677 | batch_normalize=1 678 | filters=512 679 | size=3 680 | stride=1 681 | pad=1 682 | activation=mish 683 | 684 | [shortcut] 685 | from=-3 686 | activation=linear 687 | 688 | [convolutional] 689 | batch_normalize=1 690 | filters=512 691 | size=1 692 | stride=1 693 | pad=1 694 | activation=mish 695 | 696 | [convolutional] 697 | batch_normalize=1 698 | filters=512 699 | size=3 700 | stride=1 701 | pad=1 702 | activation=mish 703 | 704 | [shortcut] 705 | from=-3 706 | activation=linear 707 | 708 | [convolutional] 709 | batch_normalize=1 710 | filters=512 711 | size=1 712 | stride=1 713 | pad=1 714 | activation=mish 715 | 716 | [convolutional] 717 | batch_normalize=1 718 | filters=512 719 | size=3 720 | stride=1 721 | pad=1 722 | activation=mish 723 | 724 | [shortcut] 725 | from=-3 726 | activation=linear 727 | 728 | [convolutional] 729 | batch_normalize=1 730 | filters=512 731 | size=1 732 | stride=1 733 | pad=1 734 | activation=mish 735 | 736 | [route] 737 | layers = -1,-16 738 | 739 | [convolutional] 740 | batch_normalize=1 741 | filters=1024 742 | size=1 743 | stride=1 744 | pad=1 745 | activation=mish 746 | stopbackward=800 747 | 748 | ########################## 749 | 750 | [convolutional] 751 | batch_normalize=1 752 | filters=512 753 | size=1 754 | stride=1 755 | pad=1 756 | activation=leaky 757 | 758 | [convolutional] 759 | batch_normalize=1 760 | size=3 761 | stride=1 762 | pad=1 763 | filters=1024 764 | activation=leaky 765 | 766 | [convolutional] 767 | batch_normalize=1 768 | filters=512 769 | size=1 770 | stride=1 771 | pad=1 772 | activation=leaky 773 | 774 | ### SPP ### 775 | [maxpool] 776 | stride=1 777 | size=5 778 | 779 | [route] 780 | layers=-2 781 | 782 | [maxpool] 783 | stride=1 784 | size=9 785 | 786 | [route] 787 | layers=-4 788 | 789 | [maxpool] 790 | stride=1 791 | size=13 792 | 793 | [route] 794 | layers=-1,-3,-5,-6 795 | ### End SPP ### 796 | 797 | [convolutional] 798 | batch_normalize=1 799 | filters=512 800 | size=1 801 | stride=1 802 | pad=1 803 | activation=leaky 804 | 805 | [convolutional] 806 | batch_normalize=1 807 | size=3 808 | stride=1 809 | pad=1 810 | filters=1024 811 | activation=leaky 812 | 813 | [convolutional] 814 | batch_normalize=1 815 | filters=512 816 | size=1 817 | stride=1 818 | pad=1 819 | activation=leaky 820 | 821 | [convolutional] 822 | batch_normalize=1 823 | filters=256 824 | size=1 825 | stride=1 826 | pad=1 827 | activation=leaky 828 | 829 | [upsample] 830 | stride=2 831 | 832 | [route] 833 | layers = 85 834 | 835 | [convolutional] 836 | batch_normalize=1 837 | filters=256 838 | size=1 839 | stride=1 840 | pad=1 841 | activation=leaky 842 | 843 | [route] 844 | layers = -1, -3 845 | 846 | [convolutional] 847 | batch_normalize=1 848 | filters=256 849 | size=1 850 | stride=1 851 | pad=1 852 | activation=leaky 853 | 854 | [convolutional] 855 | batch_normalize=1 856 | size=3 857 | stride=1 858 | pad=1 859 | filters=512 860 | activation=leaky 861 | 862 | [convolutional] 863 | batch_normalize=1 864 | filters=256 865 | size=1 866 | stride=1 867 | pad=1 868 | activation=leaky 869 | 870 | [convolutional] 871 | batch_normalize=1 872 | size=3 873 | stride=1 874 | pad=1 875 | filters=512 876 | activation=leaky 877 | 878 | [convolutional] 879 | batch_normalize=1 880 | filters=256 881 | size=1 882 | stride=1 883 | pad=1 884 | activation=leaky 885 | 886 | [convolutional] 887 | batch_normalize=1 888 | filters=128 889 | size=1 890 | stride=1 891 | pad=1 892 | activation=leaky 893 | 894 | [upsample] 895 | stride=2 896 | 897 | [route] 898 | layers = 54 899 | 900 | [convolutional] 901 | batch_normalize=1 902 | filters=128 903 | size=1 904 | stride=1 905 | pad=1 906 | activation=leaky 907 | 908 | [route] 909 | layers = -1, -3 910 | 911 | [convolutional] 912 | batch_normalize=1 913 | filters=128 914 | size=1 915 | stride=1 916 | pad=1 917 | activation=leaky 918 | 919 | [convolutional] 920 | batch_normalize=1 921 | size=3 922 | stride=1 923 | pad=1 924 | filters=256 925 | activation=leaky 926 | 927 | [convolutional] 928 | batch_normalize=1 929 | filters=128 930 | size=1 931 | stride=1 932 | pad=1 933 | activation=leaky 934 | 935 | [convolutional] 936 | batch_normalize=1 937 | size=3 938 | stride=1 939 | pad=1 940 | filters=256 941 | activation=leaky 942 | 943 | [convolutional] 944 | batch_normalize=1 945 | filters=128 946 | size=1 947 | stride=1 948 | pad=1 949 | activation=leaky 950 | 951 | ########################## 952 | 953 | [convolutional] 954 | batch_normalize=1 955 | size=3 956 | stride=1 957 | pad=1 958 | filters=256 959 | activation=leaky 960 | 961 | [convolutional] 962 | size=1 963 | stride=1 964 | pad=1 965 | filters=21 966 | activation=linear 967 | 968 | 969 | [yolo] 970 | mask = 0,1,2 971 | anchors = 9,18, 17,45, 26,84, 38,132, 48,188, 62,256, 87,338, 133,215, 192,355 972 | classes=2 973 | num=9 974 | jitter=.3 975 | ignore_thresh = .7 976 | truth_thresh = 1 977 | random=1 978 | scale_x_y = 1.2 979 | iou_thresh=0.213 980 | cls_normalizer=1.0 981 | iou_normalizer=0.07 982 | iou_loss=ciou 983 | nms_kind=greedynms 984 | beta_nms=0.6 985 | max_delta=5 986 | 987 | 988 | [route] 989 | layers = -4 990 | 991 | [convolutional] 992 | batch_normalize=1 993 | size=3 994 | stride=2 995 | pad=1 996 | filters=256 997 | activation=leaky 998 | 999 | [route] 1000 | layers = -1, -16 1001 | 1002 | [convolutional] 1003 | batch_normalize=1 1004 | filters=256 1005 | size=1 1006 | stride=1 1007 | pad=1 1008 | activation=leaky 1009 | 1010 | [convolutional] 1011 | batch_normalize=1 1012 | size=3 1013 | stride=1 1014 | pad=1 1015 | filters=512 1016 | activation=leaky 1017 | 1018 | [convolutional] 1019 | batch_normalize=1 1020 | filters=256 1021 | size=1 1022 | stride=1 1023 | pad=1 1024 | activation=leaky 1025 | 1026 | [convolutional] 1027 | batch_normalize=1 1028 | size=3 1029 | stride=1 1030 | pad=1 1031 | filters=512 1032 | activation=leaky 1033 | 1034 | [convolutional] 1035 | batch_normalize=1 1036 | filters=256 1037 | size=1 1038 | stride=1 1039 | pad=1 1040 | activation=leaky 1041 | 1042 | [convolutional] 1043 | batch_normalize=1 1044 | size=3 1045 | stride=1 1046 | pad=1 1047 | filters=512 1048 | activation=leaky 1049 | 1050 | [convolutional] 1051 | size=1 1052 | stride=1 1053 | pad=1 1054 | filters=21 1055 | activation=linear 1056 | 1057 | 1058 | [yolo] 1059 | mask = 3,4,5 1060 | anchors = 9,18, 17,45, 26,84, 38,132, 48,188, 62,256, 87,338, 133,215, 192,355 1061 | classes=2 1062 | num=9 1063 | jitter=.3 1064 | ignore_thresh = .7 1065 | truth_thresh = 1 1066 | random=1 1067 | scale_x_y = 1.1 1068 | iou_thresh=0.213 1069 | cls_normalizer=1.0 1070 | iou_normalizer=0.07 1071 | iou_loss=ciou 1072 | nms_kind=greedynms 1073 | beta_nms=0.6 1074 | max_delta=5 1075 | 1076 | 1077 | [route] 1078 | layers = -4 1079 | 1080 | [convolutional] 1081 | batch_normalize=1 1082 | size=3 1083 | stride=2 1084 | pad=1 1085 | filters=512 1086 | activation=leaky 1087 | 1088 | [route] 1089 | layers = -1, -37 1090 | 1091 | [convolutional] 1092 | batch_normalize=1 1093 | filters=512 1094 | size=1 1095 | stride=1 1096 | pad=1 1097 | activation=leaky 1098 | 1099 | [convolutional] 1100 | batch_normalize=1 1101 | size=3 1102 | stride=1 1103 | pad=1 1104 | filters=1024 1105 | activation=leaky 1106 | 1107 | [convolutional] 1108 | batch_normalize=1 1109 | filters=512 1110 | size=1 1111 | stride=1 1112 | pad=1 1113 | activation=leaky 1114 | 1115 | [convolutional] 1116 | batch_normalize=1 1117 | size=3 1118 | stride=1 1119 | pad=1 1120 | filters=1024 1121 | activation=leaky 1122 | 1123 | [convolutional] 1124 | batch_normalize=1 1125 | filters=512 1126 | size=1 1127 | stride=1 1128 | pad=1 1129 | activation=leaky 1130 | 1131 | [convolutional] 1132 | batch_normalize=1 1133 | size=3 1134 | stride=1 1135 | pad=1 1136 | filters=1024 1137 | activation=leaky 1138 | 1139 | [convolutional] 1140 | size=1 1141 | stride=1 1142 | pad=1 1143 | filters=21 1144 | activation=linear 1145 | 1146 | 1147 | [yolo] 1148 | mask = 6,7,8 1149 | anchors = 9,18, 17,45, 26,84, 38,132, 48,188, 62,256, 87,338, 133,215, 192,355 1150 | classes=2 1151 | num=9 1152 | jitter=.3 1153 | ignore_thresh = .7 1154 | truth_thresh = 1 1155 | random=1 1156 | scale_x_y = 1.05 1157 | iou_thresh=0.213 1158 | cls_normalizer=1.0 1159 | iou_normalizer=0.07 1160 | iou_loss=ciou 1161 | nms_kind=greedynms 1162 | beta_nms=0.6 1163 | max_delta=5 1164 | 1165 | -------------------------------------------------------------------------------- /cfg/yolov4-crowdhuman-480x480.cfg: -------------------------------------------------------------------------------- 1 | [net] 2 | # Training 3 | batch=64 4 | subdivisions=32 5 | # Testing 6 | #batch=1 7 | #subdivisions=1 8 | width=480 9 | height=480 10 | channels=3 11 | momentum=0.949 12 | decay=0.0005 13 | angle=0 14 | saturation = 1.5 15 | exposure = 1.5 16 | hue=.1 17 | 18 | learning_rate=0.0013 19 | burn_in=1000 20 | max_batches=6000 21 | policy=steps 22 | steps=4800,5400 23 | scales=.1,.1 24 | 25 | max_chart_loss=40.0 26 | 27 | #cutmix=1 28 | mosaic=1 29 | 30 | #:104x104 54:52x52 85:26x26 104:13x13 for 416 31 | 32 | [convolutional] 33 | batch_normalize=1 34 | filters=32 35 | size=3 36 | stride=1 37 | pad=1 38 | activation=mish 39 | 40 | # Downsample 41 | 42 | [convolutional] 43 | batch_normalize=1 44 | filters=64 45 | size=3 46 | stride=2 47 | pad=1 48 | activation=mish 49 | 50 | [convolutional] 51 | batch_normalize=1 52 | filters=64 53 | size=1 54 | stride=1 55 | pad=1 56 | activation=mish 57 | 58 | [route] 59 | layers = -2 60 | 61 | [convolutional] 62 | batch_normalize=1 63 | filters=64 64 | size=1 65 | stride=1 66 | pad=1 67 | activation=mish 68 | 69 | [convolutional] 70 | batch_normalize=1 71 | filters=32 72 | size=1 73 | stride=1 74 | pad=1 75 | activation=mish 76 | 77 | [convolutional] 78 | batch_normalize=1 79 | filters=64 80 | size=3 81 | stride=1 82 | pad=1 83 | activation=mish 84 | 85 | [shortcut] 86 | from=-3 87 | activation=linear 88 | 89 | [convolutional] 90 | batch_normalize=1 91 | filters=64 92 | size=1 93 | stride=1 94 | pad=1 95 | activation=mish 96 | 97 | [route] 98 | layers = -1,-7 99 | 100 | [convolutional] 101 | batch_normalize=1 102 | filters=64 103 | size=1 104 | stride=1 105 | pad=1 106 | activation=mish 107 | 108 | # Downsample 109 | 110 | [convolutional] 111 | batch_normalize=1 112 | filters=128 113 | size=3 114 | stride=2 115 | pad=1 116 | activation=mish 117 | 118 | [convolutional] 119 | batch_normalize=1 120 | filters=64 121 | size=1 122 | stride=1 123 | pad=1 124 | activation=mish 125 | 126 | [route] 127 | layers = -2 128 | 129 | [convolutional] 130 | batch_normalize=1 131 | filters=64 132 | size=1 133 | stride=1 134 | pad=1 135 | activation=mish 136 | 137 | [convolutional] 138 | batch_normalize=1 139 | filters=64 140 | size=1 141 | stride=1 142 | pad=1 143 | activation=mish 144 | 145 | [convolutional] 146 | batch_normalize=1 147 | filters=64 148 | size=3 149 | stride=1 150 | pad=1 151 | activation=mish 152 | 153 | [shortcut] 154 | from=-3 155 | activation=linear 156 | 157 | [convolutional] 158 | batch_normalize=1 159 | filters=64 160 | size=1 161 | stride=1 162 | pad=1 163 | activation=mish 164 | 165 | [convolutional] 166 | batch_normalize=1 167 | filters=64 168 | size=3 169 | stride=1 170 | pad=1 171 | activation=mish 172 | 173 | [shortcut] 174 | from=-3 175 | activation=linear 176 | 177 | [convolutional] 178 | batch_normalize=1 179 | filters=64 180 | size=1 181 | stride=1 182 | pad=1 183 | activation=mish 184 | 185 | [route] 186 | layers = -1,-10 187 | 188 | [convolutional] 189 | batch_normalize=1 190 | filters=128 191 | size=1 192 | stride=1 193 | pad=1 194 | activation=mish 195 | 196 | # Downsample 197 | 198 | [convolutional] 199 | batch_normalize=1 200 | filters=256 201 | size=3 202 | stride=2 203 | pad=1 204 | activation=mish 205 | 206 | [convolutional] 207 | batch_normalize=1 208 | filters=128 209 | size=1 210 | stride=1 211 | pad=1 212 | activation=mish 213 | 214 | [route] 215 | layers = -2 216 | 217 | [convolutional] 218 | batch_normalize=1 219 | filters=128 220 | size=1 221 | stride=1 222 | pad=1 223 | activation=mish 224 | 225 | [convolutional] 226 | batch_normalize=1 227 | filters=128 228 | size=1 229 | stride=1 230 | pad=1 231 | activation=mish 232 | 233 | [convolutional] 234 | batch_normalize=1 235 | filters=128 236 | size=3 237 | stride=1 238 | pad=1 239 | activation=mish 240 | 241 | [shortcut] 242 | from=-3 243 | activation=linear 244 | 245 | [convolutional] 246 | batch_normalize=1 247 | filters=128 248 | size=1 249 | stride=1 250 | pad=1 251 | activation=mish 252 | 253 | [convolutional] 254 | batch_normalize=1 255 | filters=128 256 | size=3 257 | stride=1 258 | pad=1 259 | activation=mish 260 | 261 | [shortcut] 262 | from=-3 263 | activation=linear 264 | 265 | [convolutional] 266 | batch_normalize=1 267 | filters=128 268 | size=1 269 | stride=1 270 | pad=1 271 | activation=mish 272 | 273 | [convolutional] 274 | batch_normalize=1 275 | filters=128 276 | size=3 277 | stride=1 278 | pad=1 279 | activation=mish 280 | 281 | [shortcut] 282 | from=-3 283 | activation=linear 284 | 285 | [convolutional] 286 | batch_normalize=1 287 | filters=128 288 | size=1 289 | stride=1 290 | pad=1 291 | activation=mish 292 | 293 | [convolutional] 294 | batch_normalize=1 295 | filters=128 296 | size=3 297 | stride=1 298 | pad=1 299 | activation=mish 300 | 301 | [shortcut] 302 | from=-3 303 | activation=linear 304 | 305 | 306 | [convolutional] 307 | batch_normalize=1 308 | filters=128 309 | size=1 310 | stride=1 311 | pad=1 312 | activation=mish 313 | 314 | [convolutional] 315 | batch_normalize=1 316 | filters=128 317 | size=3 318 | stride=1 319 | pad=1 320 | activation=mish 321 | 322 | [shortcut] 323 | from=-3 324 | activation=linear 325 | 326 | [convolutional] 327 | batch_normalize=1 328 | filters=128 329 | size=1 330 | stride=1 331 | pad=1 332 | activation=mish 333 | 334 | [convolutional] 335 | batch_normalize=1 336 | filters=128 337 | size=3 338 | stride=1 339 | pad=1 340 | activation=mish 341 | 342 | [shortcut] 343 | from=-3 344 | activation=linear 345 | 346 | [convolutional] 347 | batch_normalize=1 348 | filters=128 349 | size=1 350 | stride=1 351 | pad=1 352 | activation=mish 353 | 354 | [convolutional] 355 | batch_normalize=1 356 | filters=128 357 | size=3 358 | stride=1 359 | pad=1 360 | activation=mish 361 | 362 | [shortcut] 363 | from=-3 364 | activation=linear 365 | 366 | [convolutional] 367 | batch_normalize=1 368 | filters=128 369 | size=1 370 | stride=1 371 | pad=1 372 | activation=mish 373 | 374 | [convolutional] 375 | batch_normalize=1 376 | filters=128 377 | size=3 378 | stride=1 379 | pad=1 380 | activation=mish 381 | 382 | [shortcut] 383 | from=-3 384 | activation=linear 385 | 386 | [convolutional] 387 | batch_normalize=1 388 | filters=128 389 | size=1 390 | stride=1 391 | pad=1 392 | activation=mish 393 | 394 | [route] 395 | layers = -1,-28 396 | 397 | [convolutional] 398 | batch_normalize=1 399 | filters=256 400 | size=1 401 | stride=1 402 | pad=1 403 | activation=mish 404 | 405 | # Downsample 406 | 407 | [convolutional] 408 | batch_normalize=1 409 | filters=512 410 | size=3 411 | stride=2 412 | pad=1 413 | activation=mish 414 | 415 | [convolutional] 416 | batch_normalize=1 417 | filters=256 418 | size=1 419 | stride=1 420 | pad=1 421 | activation=mish 422 | 423 | [route] 424 | layers = -2 425 | 426 | [convolutional] 427 | batch_normalize=1 428 | filters=256 429 | size=1 430 | stride=1 431 | pad=1 432 | activation=mish 433 | 434 | [convolutional] 435 | batch_normalize=1 436 | filters=256 437 | size=1 438 | stride=1 439 | pad=1 440 | activation=mish 441 | 442 | [convolutional] 443 | batch_normalize=1 444 | filters=256 445 | size=3 446 | stride=1 447 | pad=1 448 | activation=mish 449 | 450 | [shortcut] 451 | from=-3 452 | activation=linear 453 | 454 | 455 | [convolutional] 456 | batch_normalize=1 457 | filters=256 458 | size=1 459 | stride=1 460 | pad=1 461 | activation=mish 462 | 463 | [convolutional] 464 | batch_normalize=1 465 | filters=256 466 | size=3 467 | stride=1 468 | pad=1 469 | activation=mish 470 | 471 | [shortcut] 472 | from=-3 473 | activation=linear 474 | 475 | 476 | [convolutional] 477 | batch_normalize=1 478 | filters=256 479 | size=1 480 | stride=1 481 | pad=1 482 | activation=mish 483 | 484 | [convolutional] 485 | batch_normalize=1 486 | filters=256 487 | size=3 488 | stride=1 489 | pad=1 490 | activation=mish 491 | 492 | [shortcut] 493 | from=-3 494 | activation=linear 495 | 496 | 497 | [convolutional] 498 | batch_normalize=1 499 | filters=256 500 | size=1 501 | stride=1 502 | pad=1 503 | activation=mish 504 | 505 | [convolutional] 506 | batch_normalize=1 507 | filters=256 508 | size=3 509 | stride=1 510 | pad=1 511 | activation=mish 512 | 513 | [shortcut] 514 | from=-3 515 | activation=linear 516 | 517 | 518 | [convolutional] 519 | batch_normalize=1 520 | filters=256 521 | size=1 522 | stride=1 523 | pad=1 524 | activation=mish 525 | 526 | [convolutional] 527 | batch_normalize=1 528 | filters=256 529 | size=3 530 | stride=1 531 | pad=1 532 | activation=mish 533 | 534 | [shortcut] 535 | from=-3 536 | activation=linear 537 | 538 | 539 | [convolutional] 540 | batch_normalize=1 541 | filters=256 542 | size=1 543 | stride=1 544 | pad=1 545 | activation=mish 546 | 547 | [convolutional] 548 | batch_normalize=1 549 | filters=256 550 | size=3 551 | stride=1 552 | pad=1 553 | activation=mish 554 | 555 | [shortcut] 556 | from=-3 557 | activation=linear 558 | 559 | 560 | [convolutional] 561 | batch_normalize=1 562 | filters=256 563 | size=1 564 | stride=1 565 | pad=1 566 | activation=mish 567 | 568 | [convolutional] 569 | batch_normalize=1 570 | filters=256 571 | size=3 572 | stride=1 573 | pad=1 574 | activation=mish 575 | 576 | [shortcut] 577 | from=-3 578 | activation=linear 579 | 580 | [convolutional] 581 | batch_normalize=1 582 | filters=256 583 | size=1 584 | stride=1 585 | pad=1 586 | activation=mish 587 | 588 | [convolutional] 589 | batch_normalize=1 590 | filters=256 591 | size=3 592 | stride=1 593 | pad=1 594 | activation=mish 595 | 596 | [shortcut] 597 | from=-3 598 | activation=linear 599 | 600 | [convolutional] 601 | batch_normalize=1 602 | filters=256 603 | size=1 604 | stride=1 605 | pad=1 606 | activation=mish 607 | 608 | [route] 609 | layers = -1,-28 610 | 611 | [convolutional] 612 | batch_normalize=1 613 | filters=512 614 | size=1 615 | stride=1 616 | pad=1 617 | activation=mish 618 | 619 | # Downsample 620 | 621 | [convolutional] 622 | batch_normalize=1 623 | filters=1024 624 | size=3 625 | stride=2 626 | pad=1 627 | activation=mish 628 | 629 | [convolutional] 630 | batch_normalize=1 631 | filters=512 632 | size=1 633 | stride=1 634 | pad=1 635 | activation=mish 636 | 637 | [route] 638 | layers = -2 639 | 640 | [convolutional] 641 | batch_normalize=1 642 | filters=512 643 | size=1 644 | stride=1 645 | pad=1 646 | activation=mish 647 | 648 | [convolutional] 649 | batch_normalize=1 650 | filters=512 651 | size=1 652 | stride=1 653 | pad=1 654 | activation=mish 655 | 656 | [convolutional] 657 | batch_normalize=1 658 | filters=512 659 | size=3 660 | stride=1 661 | pad=1 662 | activation=mish 663 | 664 | [shortcut] 665 | from=-3 666 | activation=linear 667 | 668 | [convolutional] 669 | batch_normalize=1 670 | filters=512 671 | size=1 672 | stride=1 673 | pad=1 674 | activation=mish 675 | 676 | [convolutional] 677 | batch_normalize=1 678 | filters=512 679 | size=3 680 | stride=1 681 | pad=1 682 | activation=mish 683 | 684 | [shortcut] 685 | from=-3 686 | activation=linear 687 | 688 | [convolutional] 689 | batch_normalize=1 690 | filters=512 691 | size=1 692 | stride=1 693 | pad=1 694 | activation=mish 695 | 696 | [convolutional] 697 | batch_normalize=1 698 | filters=512 699 | size=3 700 | stride=1 701 | pad=1 702 | activation=mish 703 | 704 | [shortcut] 705 | from=-3 706 | activation=linear 707 | 708 | [convolutional] 709 | batch_normalize=1 710 | filters=512 711 | size=1 712 | stride=1 713 | pad=1 714 | activation=mish 715 | 716 | [convolutional] 717 | batch_normalize=1 718 | filters=512 719 | size=3 720 | stride=1 721 | pad=1 722 | activation=mish 723 | 724 | [shortcut] 725 | from=-3 726 | activation=linear 727 | 728 | [convolutional] 729 | batch_normalize=1 730 | filters=512 731 | size=1 732 | stride=1 733 | pad=1 734 | activation=mish 735 | 736 | [route] 737 | layers = -1,-16 738 | 739 | [convolutional] 740 | batch_normalize=1 741 | filters=1024 742 | size=1 743 | stride=1 744 | pad=1 745 | activation=mish 746 | stopbackward=800 747 | 748 | ########################## 749 | 750 | [convolutional] 751 | batch_normalize=1 752 | filters=512 753 | size=1 754 | stride=1 755 | pad=1 756 | activation=leaky 757 | 758 | [convolutional] 759 | batch_normalize=1 760 | size=3 761 | stride=1 762 | pad=1 763 | filters=1024 764 | activation=leaky 765 | 766 | [convolutional] 767 | batch_normalize=1 768 | filters=512 769 | size=1 770 | stride=1 771 | pad=1 772 | activation=leaky 773 | 774 | ### SPP ### 775 | [maxpool] 776 | stride=1 777 | size=5 778 | 779 | [route] 780 | layers=-2 781 | 782 | [maxpool] 783 | stride=1 784 | size=9 785 | 786 | [route] 787 | layers=-4 788 | 789 | [maxpool] 790 | stride=1 791 | size=13 792 | 793 | [route] 794 | layers=-1,-3,-5,-6 795 | ### End SPP ### 796 | 797 | [convolutional] 798 | batch_normalize=1 799 | filters=512 800 | size=1 801 | stride=1 802 | pad=1 803 | activation=leaky 804 | 805 | [convolutional] 806 | batch_normalize=1 807 | size=3 808 | stride=1 809 | pad=1 810 | filters=1024 811 | activation=leaky 812 | 813 | [convolutional] 814 | batch_normalize=1 815 | filters=512 816 | size=1 817 | stride=1 818 | pad=1 819 | activation=leaky 820 | 821 | [convolutional] 822 | batch_normalize=1 823 | filters=256 824 | size=1 825 | stride=1 826 | pad=1 827 | activation=leaky 828 | 829 | [upsample] 830 | stride=2 831 | 832 | [route] 833 | layers = 85 834 | 835 | [convolutional] 836 | batch_normalize=1 837 | filters=256 838 | size=1 839 | stride=1 840 | pad=1 841 | activation=leaky 842 | 843 | [route] 844 | layers = -1, -3 845 | 846 | [convolutional] 847 | batch_normalize=1 848 | filters=256 849 | size=1 850 | stride=1 851 | pad=1 852 | activation=leaky 853 | 854 | [convolutional] 855 | batch_normalize=1 856 | size=3 857 | stride=1 858 | pad=1 859 | filters=512 860 | activation=leaky 861 | 862 | [convolutional] 863 | batch_normalize=1 864 | filters=256 865 | size=1 866 | stride=1 867 | pad=1 868 | activation=leaky 869 | 870 | [convolutional] 871 | batch_normalize=1 872 | size=3 873 | stride=1 874 | pad=1 875 | filters=512 876 | activation=leaky 877 | 878 | [convolutional] 879 | batch_normalize=1 880 | filters=256 881 | size=1 882 | stride=1 883 | pad=1 884 | activation=leaky 885 | 886 | [convolutional] 887 | batch_normalize=1 888 | filters=128 889 | size=1 890 | stride=1 891 | pad=1 892 | activation=leaky 893 | 894 | [upsample] 895 | stride=2 896 | 897 | [route] 898 | layers = 54 899 | 900 | [convolutional] 901 | batch_normalize=1 902 | filters=128 903 | size=1 904 | stride=1 905 | pad=1 906 | activation=leaky 907 | 908 | [route] 909 | layers = -1, -3 910 | 911 | [convolutional] 912 | batch_normalize=1 913 | filters=128 914 | size=1 915 | stride=1 916 | pad=1 917 | activation=leaky 918 | 919 | [convolutional] 920 | batch_normalize=1 921 | size=3 922 | stride=1 923 | pad=1 924 | filters=256 925 | activation=leaky 926 | 927 | [convolutional] 928 | batch_normalize=1 929 | filters=128 930 | size=1 931 | stride=1 932 | pad=1 933 | activation=leaky 934 | 935 | [convolutional] 936 | batch_normalize=1 937 | size=3 938 | stride=1 939 | pad=1 940 | filters=256 941 | activation=leaky 942 | 943 | [convolutional] 944 | batch_normalize=1 945 | filters=128 946 | size=1 947 | stride=1 948 | pad=1 949 | activation=leaky 950 | 951 | ########################## 952 | 953 | [convolutional] 954 | batch_normalize=1 955 | size=3 956 | stride=1 957 | pad=1 958 | filters=256 959 | activation=leaky 960 | 961 | [convolutional] 962 | size=1 963 | stride=1 964 | pad=1 965 | filters=21 966 | activation=linear 967 | 968 | 969 | [yolo] 970 | mask = 0,1,2 971 | anchors = 10,19, 19,50, 30,93, 43,148, 55,213, 71,292, 99,388, 154,249, 219,411 972 | classes=2 973 | num=9 974 | jitter=.3 975 | ignore_thresh = .7 976 | truth_thresh = 1 977 | random=1 978 | scale_x_y = 1.2 979 | iou_thresh=0.213 980 | cls_normalizer=1.0 981 | iou_normalizer=0.07 982 | iou_loss=ciou 983 | nms_kind=greedynms 984 | beta_nms=0.6 985 | max_delta=5 986 | 987 | 988 | [route] 989 | layers = -4 990 | 991 | [convolutional] 992 | batch_normalize=1 993 | size=3 994 | stride=2 995 | pad=1 996 | filters=256 997 | activation=leaky 998 | 999 | [route] 1000 | layers = -1, -16 1001 | 1002 | [convolutional] 1003 | batch_normalize=1 1004 | filters=256 1005 | size=1 1006 | stride=1 1007 | pad=1 1008 | activation=leaky 1009 | 1010 | [convolutional] 1011 | batch_normalize=1 1012 | size=3 1013 | stride=1 1014 | pad=1 1015 | filters=512 1016 | activation=leaky 1017 | 1018 | [convolutional] 1019 | batch_normalize=1 1020 | filters=256 1021 | size=1 1022 | stride=1 1023 | pad=1 1024 | activation=leaky 1025 | 1026 | [convolutional] 1027 | batch_normalize=1 1028 | size=3 1029 | stride=1 1030 | pad=1 1031 | filters=512 1032 | activation=leaky 1033 | 1034 | [convolutional] 1035 | batch_normalize=1 1036 | filters=256 1037 | size=1 1038 | stride=1 1039 | pad=1 1040 | activation=leaky 1041 | 1042 | [convolutional] 1043 | batch_normalize=1 1044 | size=3 1045 | stride=1 1046 | pad=1 1047 | filters=512 1048 | activation=leaky 1049 | 1050 | [convolutional] 1051 | size=1 1052 | stride=1 1053 | pad=1 1054 | filters=21 1055 | activation=linear 1056 | 1057 | 1058 | [yolo] 1059 | mask = 3,4,5 1060 | anchors = 10,19, 19,50, 30,93, 43,148, 55,213, 71,292, 99,388, 154,249, 219,411 1061 | classes=2 1062 | num=9 1063 | jitter=.3 1064 | ignore_thresh = .7 1065 | truth_thresh = 1 1066 | random=1 1067 | scale_x_y = 1.1 1068 | iou_thresh=0.213 1069 | cls_normalizer=1.0 1070 | iou_normalizer=0.07 1071 | iou_loss=ciou 1072 | nms_kind=greedynms 1073 | beta_nms=0.6 1074 | max_delta=5 1075 | 1076 | 1077 | [route] 1078 | layers = -4 1079 | 1080 | [convolutional] 1081 | batch_normalize=1 1082 | size=3 1083 | stride=2 1084 | pad=1 1085 | filters=512 1086 | activation=leaky 1087 | 1088 | [route] 1089 | layers = -1, -37 1090 | 1091 | [convolutional] 1092 | batch_normalize=1 1093 | filters=512 1094 | size=1 1095 | stride=1 1096 | pad=1 1097 | activation=leaky 1098 | 1099 | [convolutional] 1100 | batch_normalize=1 1101 | size=3 1102 | stride=1 1103 | pad=1 1104 | filters=1024 1105 | activation=leaky 1106 | 1107 | [convolutional] 1108 | batch_normalize=1 1109 | filters=512 1110 | size=1 1111 | stride=1 1112 | pad=1 1113 | activation=leaky 1114 | 1115 | [convolutional] 1116 | batch_normalize=1 1117 | size=3 1118 | stride=1 1119 | pad=1 1120 | filters=1024 1121 | activation=leaky 1122 | 1123 | [convolutional] 1124 | batch_normalize=1 1125 | filters=512 1126 | size=1 1127 | stride=1 1128 | pad=1 1129 | activation=leaky 1130 | 1131 | [convolutional] 1132 | batch_normalize=1 1133 | size=3 1134 | stride=1 1135 | pad=1 1136 | filters=1024 1137 | activation=leaky 1138 | 1139 | [convolutional] 1140 | size=1 1141 | stride=1 1142 | pad=1 1143 | filters=21 1144 | activation=linear 1145 | 1146 | 1147 | [yolo] 1148 | mask = 6,7,8 1149 | anchors = 10,19, 19,50, 30,93, 43,148, 55,213, 71,292, 99,388, 154,249, 219,411 1150 | classes=2 1151 | num=9 1152 | jitter=.3 1153 | ignore_thresh = .7 1154 | truth_thresh = 1 1155 | random=1 1156 | scale_x_y = 1.05 1157 | iou_thresh=0.213 1158 | cls_normalizer=1.0 1159 | iou_normalizer=0.07 1160 | iou_loss=ciou 1161 | nms_kind=greedynms 1162 | beta_nms=0.6 1163 | max_delta=5 1164 | 1165 | -------------------------------------------------------------------------------- /cfg/yolov4-crowdhuman-608x608.cfg: -------------------------------------------------------------------------------- 1 | [net] 2 | # Training 3 | batch=64 4 | subdivisions=64 5 | # Testing 6 | #batch=1 7 | #subdivisions=1 8 | width=608 9 | height=608 10 | channels=3 11 | momentum=0.949 12 | decay=0.0005 13 | angle=0 14 | saturation = 1.5 15 | exposure = 1.5 16 | hue=.1 17 | 18 | learning_rate=0.0013 19 | burn_in=1000 20 | max_batches=6000 21 | policy=steps 22 | steps=4800,5400 23 | scales=.1,.1 24 | 25 | max_chart_loss=40.0 26 | 27 | #cutmix=1 28 | mosaic=1 29 | 30 | #:104x104 54:52x52 85:26x26 104:13x13 for 416 31 | 32 | [convolutional] 33 | batch_normalize=1 34 | filters=32 35 | size=3 36 | stride=1 37 | pad=1 38 | activation=mish 39 | 40 | # Downsample 41 | 42 | [convolutional] 43 | batch_normalize=1 44 | filters=64 45 | size=3 46 | stride=2 47 | pad=1 48 | activation=mish 49 | 50 | [convolutional] 51 | batch_normalize=1 52 | filters=64 53 | size=1 54 | stride=1 55 | pad=1 56 | activation=mish 57 | 58 | [route] 59 | layers = -2 60 | 61 | [convolutional] 62 | batch_normalize=1 63 | filters=64 64 | size=1 65 | stride=1 66 | pad=1 67 | activation=mish 68 | 69 | [convolutional] 70 | batch_normalize=1 71 | filters=32 72 | size=1 73 | stride=1 74 | pad=1 75 | activation=mish 76 | 77 | [convolutional] 78 | batch_normalize=1 79 | filters=64 80 | size=3 81 | stride=1 82 | pad=1 83 | activation=mish 84 | 85 | [shortcut] 86 | from=-3 87 | activation=linear 88 | 89 | [convolutional] 90 | batch_normalize=1 91 | filters=64 92 | size=1 93 | stride=1 94 | pad=1 95 | activation=mish 96 | 97 | [route] 98 | layers = -1,-7 99 | 100 | [convolutional] 101 | batch_normalize=1 102 | filters=64 103 | size=1 104 | stride=1 105 | pad=1 106 | activation=mish 107 | 108 | # Downsample 109 | 110 | [convolutional] 111 | batch_normalize=1 112 | filters=128 113 | size=3 114 | stride=2 115 | pad=1 116 | activation=mish 117 | 118 | [convolutional] 119 | batch_normalize=1 120 | filters=64 121 | size=1 122 | stride=1 123 | pad=1 124 | activation=mish 125 | 126 | [route] 127 | layers = -2 128 | 129 | [convolutional] 130 | batch_normalize=1 131 | filters=64 132 | size=1 133 | stride=1 134 | pad=1 135 | activation=mish 136 | 137 | [convolutional] 138 | batch_normalize=1 139 | filters=64 140 | size=1 141 | stride=1 142 | pad=1 143 | activation=mish 144 | 145 | [convolutional] 146 | batch_normalize=1 147 | filters=64 148 | size=3 149 | stride=1 150 | pad=1 151 | activation=mish 152 | 153 | [shortcut] 154 | from=-3 155 | activation=linear 156 | 157 | [convolutional] 158 | batch_normalize=1 159 | filters=64 160 | size=1 161 | stride=1 162 | pad=1 163 | activation=mish 164 | 165 | [convolutional] 166 | batch_normalize=1 167 | filters=64 168 | size=3 169 | stride=1 170 | pad=1 171 | activation=mish 172 | 173 | [shortcut] 174 | from=-3 175 | activation=linear 176 | 177 | [convolutional] 178 | batch_normalize=1 179 | filters=64 180 | size=1 181 | stride=1 182 | pad=1 183 | activation=mish 184 | 185 | [route] 186 | layers = -1,-10 187 | 188 | [convolutional] 189 | batch_normalize=1 190 | filters=128 191 | size=1 192 | stride=1 193 | pad=1 194 | activation=mish 195 | 196 | # Downsample 197 | 198 | [convolutional] 199 | batch_normalize=1 200 | filters=256 201 | size=3 202 | stride=2 203 | pad=1 204 | activation=mish 205 | 206 | [convolutional] 207 | batch_normalize=1 208 | filters=128 209 | size=1 210 | stride=1 211 | pad=1 212 | activation=mish 213 | 214 | [route] 215 | layers = -2 216 | 217 | [convolutional] 218 | batch_normalize=1 219 | filters=128 220 | size=1 221 | stride=1 222 | pad=1 223 | activation=mish 224 | 225 | [convolutional] 226 | batch_normalize=1 227 | filters=128 228 | size=1 229 | stride=1 230 | pad=1 231 | activation=mish 232 | 233 | [convolutional] 234 | batch_normalize=1 235 | filters=128 236 | size=3 237 | stride=1 238 | pad=1 239 | activation=mish 240 | 241 | [shortcut] 242 | from=-3 243 | activation=linear 244 | 245 | [convolutional] 246 | batch_normalize=1 247 | filters=128 248 | size=1 249 | stride=1 250 | pad=1 251 | activation=mish 252 | 253 | [convolutional] 254 | batch_normalize=1 255 | filters=128 256 | size=3 257 | stride=1 258 | pad=1 259 | activation=mish 260 | 261 | [shortcut] 262 | from=-3 263 | activation=linear 264 | 265 | [convolutional] 266 | batch_normalize=1 267 | filters=128 268 | size=1 269 | stride=1 270 | pad=1 271 | activation=mish 272 | 273 | [convolutional] 274 | batch_normalize=1 275 | filters=128 276 | size=3 277 | stride=1 278 | pad=1 279 | activation=mish 280 | 281 | [shortcut] 282 | from=-3 283 | activation=linear 284 | 285 | [convolutional] 286 | batch_normalize=1 287 | filters=128 288 | size=1 289 | stride=1 290 | pad=1 291 | activation=mish 292 | 293 | [convolutional] 294 | batch_normalize=1 295 | filters=128 296 | size=3 297 | stride=1 298 | pad=1 299 | activation=mish 300 | 301 | [shortcut] 302 | from=-3 303 | activation=linear 304 | 305 | 306 | [convolutional] 307 | batch_normalize=1 308 | filters=128 309 | size=1 310 | stride=1 311 | pad=1 312 | activation=mish 313 | 314 | [convolutional] 315 | batch_normalize=1 316 | filters=128 317 | size=3 318 | stride=1 319 | pad=1 320 | activation=mish 321 | 322 | [shortcut] 323 | from=-3 324 | activation=linear 325 | 326 | [convolutional] 327 | batch_normalize=1 328 | filters=128 329 | size=1 330 | stride=1 331 | pad=1 332 | activation=mish 333 | 334 | [convolutional] 335 | batch_normalize=1 336 | filters=128 337 | size=3 338 | stride=1 339 | pad=1 340 | activation=mish 341 | 342 | [shortcut] 343 | from=-3 344 | activation=linear 345 | 346 | [convolutional] 347 | batch_normalize=1 348 | filters=128 349 | size=1 350 | stride=1 351 | pad=1 352 | activation=mish 353 | 354 | [convolutional] 355 | batch_normalize=1 356 | filters=128 357 | size=3 358 | stride=1 359 | pad=1 360 | activation=mish 361 | 362 | [shortcut] 363 | from=-3 364 | activation=linear 365 | 366 | [convolutional] 367 | batch_normalize=1 368 | filters=128 369 | size=1 370 | stride=1 371 | pad=1 372 | activation=mish 373 | 374 | [convolutional] 375 | batch_normalize=1 376 | filters=128 377 | size=3 378 | stride=1 379 | pad=1 380 | activation=mish 381 | 382 | [shortcut] 383 | from=-3 384 | activation=linear 385 | 386 | [convolutional] 387 | batch_normalize=1 388 | filters=128 389 | size=1 390 | stride=1 391 | pad=1 392 | activation=mish 393 | 394 | [route] 395 | layers = -1,-28 396 | 397 | [convolutional] 398 | batch_normalize=1 399 | filters=256 400 | size=1 401 | stride=1 402 | pad=1 403 | activation=mish 404 | 405 | # Downsample 406 | 407 | [convolutional] 408 | batch_normalize=1 409 | filters=512 410 | size=3 411 | stride=2 412 | pad=1 413 | activation=mish 414 | 415 | [convolutional] 416 | batch_normalize=1 417 | filters=256 418 | size=1 419 | stride=1 420 | pad=1 421 | activation=mish 422 | 423 | [route] 424 | layers = -2 425 | 426 | [convolutional] 427 | batch_normalize=1 428 | filters=256 429 | size=1 430 | stride=1 431 | pad=1 432 | activation=mish 433 | 434 | [convolutional] 435 | batch_normalize=1 436 | filters=256 437 | size=1 438 | stride=1 439 | pad=1 440 | activation=mish 441 | 442 | [convolutional] 443 | batch_normalize=1 444 | filters=256 445 | size=3 446 | stride=1 447 | pad=1 448 | activation=mish 449 | 450 | [shortcut] 451 | from=-3 452 | activation=linear 453 | 454 | 455 | [convolutional] 456 | batch_normalize=1 457 | filters=256 458 | size=1 459 | stride=1 460 | pad=1 461 | activation=mish 462 | 463 | [convolutional] 464 | batch_normalize=1 465 | filters=256 466 | size=3 467 | stride=1 468 | pad=1 469 | activation=mish 470 | 471 | [shortcut] 472 | from=-3 473 | activation=linear 474 | 475 | 476 | [convolutional] 477 | batch_normalize=1 478 | filters=256 479 | size=1 480 | stride=1 481 | pad=1 482 | activation=mish 483 | 484 | [convolutional] 485 | batch_normalize=1 486 | filters=256 487 | size=3 488 | stride=1 489 | pad=1 490 | activation=mish 491 | 492 | [shortcut] 493 | from=-3 494 | activation=linear 495 | 496 | 497 | [convolutional] 498 | batch_normalize=1 499 | filters=256 500 | size=1 501 | stride=1 502 | pad=1 503 | activation=mish 504 | 505 | [convolutional] 506 | batch_normalize=1 507 | filters=256 508 | size=3 509 | stride=1 510 | pad=1 511 | activation=mish 512 | 513 | [shortcut] 514 | from=-3 515 | activation=linear 516 | 517 | 518 | [convolutional] 519 | batch_normalize=1 520 | filters=256 521 | size=1 522 | stride=1 523 | pad=1 524 | activation=mish 525 | 526 | [convolutional] 527 | batch_normalize=1 528 | filters=256 529 | size=3 530 | stride=1 531 | pad=1 532 | activation=mish 533 | 534 | [shortcut] 535 | from=-3 536 | activation=linear 537 | 538 | 539 | [convolutional] 540 | batch_normalize=1 541 | filters=256 542 | size=1 543 | stride=1 544 | pad=1 545 | activation=mish 546 | 547 | [convolutional] 548 | batch_normalize=1 549 | filters=256 550 | size=3 551 | stride=1 552 | pad=1 553 | activation=mish 554 | 555 | [shortcut] 556 | from=-3 557 | activation=linear 558 | 559 | 560 | [convolutional] 561 | batch_normalize=1 562 | filters=256 563 | size=1 564 | stride=1 565 | pad=1 566 | activation=mish 567 | 568 | [convolutional] 569 | batch_normalize=1 570 | filters=256 571 | size=3 572 | stride=1 573 | pad=1 574 | activation=mish 575 | 576 | [shortcut] 577 | from=-3 578 | activation=linear 579 | 580 | [convolutional] 581 | batch_normalize=1 582 | filters=256 583 | size=1 584 | stride=1 585 | pad=1 586 | activation=mish 587 | 588 | [convolutional] 589 | batch_normalize=1 590 | filters=256 591 | size=3 592 | stride=1 593 | pad=1 594 | activation=mish 595 | 596 | [shortcut] 597 | from=-3 598 | activation=linear 599 | 600 | [convolutional] 601 | batch_normalize=1 602 | filters=256 603 | size=1 604 | stride=1 605 | pad=1 606 | activation=mish 607 | 608 | [route] 609 | layers = -1,-28 610 | 611 | [convolutional] 612 | batch_normalize=1 613 | filters=512 614 | size=1 615 | stride=1 616 | pad=1 617 | activation=mish 618 | 619 | # Downsample 620 | 621 | [convolutional] 622 | batch_normalize=1 623 | filters=1024 624 | size=3 625 | stride=2 626 | pad=1 627 | activation=mish 628 | 629 | [convolutional] 630 | batch_normalize=1 631 | filters=512 632 | size=1 633 | stride=1 634 | pad=1 635 | activation=mish 636 | 637 | [route] 638 | layers = -2 639 | 640 | [convolutional] 641 | batch_normalize=1 642 | filters=512 643 | size=1 644 | stride=1 645 | pad=1 646 | activation=mish 647 | 648 | [convolutional] 649 | batch_normalize=1 650 | filters=512 651 | size=1 652 | stride=1 653 | pad=1 654 | activation=mish 655 | 656 | [convolutional] 657 | batch_normalize=1 658 | filters=512 659 | size=3 660 | stride=1 661 | pad=1 662 | activation=mish 663 | 664 | [shortcut] 665 | from=-3 666 | activation=linear 667 | 668 | [convolutional] 669 | batch_normalize=1 670 | filters=512 671 | size=1 672 | stride=1 673 | pad=1 674 | activation=mish 675 | 676 | [convolutional] 677 | batch_normalize=1 678 | filters=512 679 | size=3 680 | stride=1 681 | pad=1 682 | activation=mish 683 | 684 | [shortcut] 685 | from=-3 686 | activation=linear 687 | 688 | [convolutional] 689 | batch_normalize=1 690 | filters=512 691 | size=1 692 | stride=1 693 | pad=1 694 | activation=mish 695 | 696 | [convolutional] 697 | batch_normalize=1 698 | filters=512 699 | size=3 700 | stride=1 701 | pad=1 702 | activation=mish 703 | 704 | [shortcut] 705 | from=-3 706 | activation=linear 707 | 708 | [convolutional] 709 | batch_normalize=1 710 | filters=512 711 | size=1 712 | stride=1 713 | pad=1 714 | activation=mish 715 | 716 | [convolutional] 717 | batch_normalize=1 718 | filters=512 719 | size=3 720 | stride=1 721 | pad=1 722 | activation=mish 723 | 724 | [shortcut] 725 | from=-3 726 | activation=linear 727 | 728 | [convolutional] 729 | batch_normalize=1 730 | filters=512 731 | size=1 732 | stride=1 733 | pad=1 734 | activation=mish 735 | 736 | [route] 737 | layers = -1,-16 738 | 739 | [convolutional] 740 | batch_normalize=1 741 | filters=1024 742 | size=1 743 | stride=1 744 | pad=1 745 | activation=mish 746 | stopbackward=800 747 | 748 | ########################## 749 | 750 | [convolutional] 751 | batch_normalize=1 752 | filters=512 753 | size=1 754 | stride=1 755 | pad=1 756 | activation=leaky 757 | 758 | [convolutional] 759 | batch_normalize=1 760 | size=3 761 | stride=1 762 | pad=1 763 | filters=1024 764 | activation=leaky 765 | 766 | [convolutional] 767 | batch_normalize=1 768 | filters=512 769 | size=1 770 | stride=1 771 | pad=1 772 | activation=leaky 773 | 774 | ### SPP ### 775 | [maxpool] 776 | stride=1 777 | size=5 778 | 779 | [route] 780 | layers=-2 781 | 782 | [maxpool] 783 | stride=1 784 | size=9 785 | 786 | [route] 787 | layers=-4 788 | 789 | [maxpool] 790 | stride=1 791 | size=13 792 | 793 | [route] 794 | layers=-1,-3,-5,-6 795 | ### End SPP ### 796 | 797 | [convolutional] 798 | batch_normalize=1 799 | filters=512 800 | size=1 801 | stride=1 802 | pad=1 803 | activation=leaky 804 | 805 | [convolutional] 806 | batch_normalize=1 807 | size=3 808 | stride=1 809 | pad=1 810 | filters=1024 811 | activation=leaky 812 | 813 | [convolutional] 814 | batch_normalize=1 815 | filters=512 816 | size=1 817 | stride=1 818 | pad=1 819 | activation=leaky 820 | 821 | [convolutional] 822 | batch_normalize=1 823 | filters=256 824 | size=1 825 | stride=1 826 | pad=1 827 | activation=leaky 828 | 829 | [upsample] 830 | stride=2 831 | 832 | [route] 833 | layers = 85 834 | 835 | [convolutional] 836 | batch_normalize=1 837 | filters=256 838 | size=1 839 | stride=1 840 | pad=1 841 | activation=leaky 842 | 843 | [route] 844 | layers = -1, -3 845 | 846 | [convolutional] 847 | batch_normalize=1 848 | filters=256 849 | size=1 850 | stride=1 851 | pad=1 852 | activation=leaky 853 | 854 | [convolutional] 855 | batch_normalize=1 856 | size=3 857 | stride=1 858 | pad=1 859 | filters=512 860 | activation=leaky 861 | 862 | [convolutional] 863 | batch_normalize=1 864 | filters=256 865 | size=1 866 | stride=1 867 | pad=1 868 | activation=leaky 869 | 870 | [convolutional] 871 | batch_normalize=1 872 | size=3 873 | stride=1 874 | pad=1 875 | filters=512 876 | activation=leaky 877 | 878 | [convolutional] 879 | batch_normalize=1 880 | filters=256 881 | size=1 882 | stride=1 883 | pad=1 884 | activation=leaky 885 | 886 | [convolutional] 887 | batch_normalize=1 888 | filters=128 889 | size=1 890 | stride=1 891 | pad=1 892 | activation=leaky 893 | 894 | [upsample] 895 | stride=2 896 | 897 | [route] 898 | layers = 54 899 | 900 | [convolutional] 901 | batch_normalize=1 902 | filters=128 903 | size=1 904 | stride=1 905 | pad=1 906 | activation=leaky 907 | 908 | [route] 909 | layers = -1, -3 910 | 911 | [convolutional] 912 | batch_normalize=1 913 | filters=128 914 | size=1 915 | stride=1 916 | pad=1 917 | activation=leaky 918 | 919 | [convolutional] 920 | batch_normalize=1 921 | size=3 922 | stride=1 923 | pad=1 924 | filters=256 925 | activation=leaky 926 | 927 | [convolutional] 928 | batch_normalize=1 929 | filters=128 930 | size=1 931 | stride=1 932 | pad=1 933 | activation=leaky 934 | 935 | [convolutional] 936 | batch_normalize=1 937 | size=3 938 | stride=1 939 | pad=1 940 | filters=256 941 | activation=leaky 942 | 943 | [convolutional] 944 | batch_normalize=1 945 | filters=128 946 | size=1 947 | stride=1 948 | pad=1 949 | activation=leaky 950 | 951 | ########################## 952 | 953 | [convolutional] 954 | batch_normalize=1 955 | size=3 956 | stride=1 957 | pad=1 958 | filters=256 959 | activation=leaky 960 | 961 | [convolutional] 962 | size=1 963 | stride=1 964 | pad=1 965 | filters=21 966 | activation=linear 967 | 968 | 969 | [yolo] 970 | mask = 0,1,2 971 | anchors = 11,22, 24,60, 37,116, 54,186, 69,268, 89,369, 126,491, 194,314, 278,520 972 | classes=2 973 | num=9 974 | jitter=.3 975 | ignore_thresh = .7 976 | truth_thresh = 1 977 | random=1 978 | scale_x_y = 1.2 979 | iou_thresh=0.213 980 | cls_normalizer=1.0 981 | iou_normalizer=0.07 982 | iou_loss=ciou 983 | nms_kind=greedynms 984 | beta_nms=0.6 985 | max_delta=5 986 | 987 | 988 | [route] 989 | layers = -4 990 | 991 | [convolutional] 992 | batch_normalize=1 993 | size=3 994 | stride=2 995 | pad=1 996 | filters=256 997 | activation=leaky 998 | 999 | [route] 1000 | layers = -1, -16 1001 | 1002 | [convolutional] 1003 | batch_normalize=1 1004 | filters=256 1005 | size=1 1006 | stride=1 1007 | pad=1 1008 | activation=leaky 1009 | 1010 | [convolutional] 1011 | batch_normalize=1 1012 | size=3 1013 | stride=1 1014 | pad=1 1015 | filters=512 1016 | activation=leaky 1017 | 1018 | [convolutional] 1019 | batch_normalize=1 1020 | filters=256 1021 | size=1 1022 | stride=1 1023 | pad=1 1024 | activation=leaky 1025 | 1026 | [convolutional] 1027 | batch_normalize=1 1028 | size=3 1029 | stride=1 1030 | pad=1 1031 | filters=512 1032 | activation=leaky 1033 | 1034 | [convolutional] 1035 | batch_normalize=1 1036 | filters=256 1037 | size=1 1038 | stride=1 1039 | pad=1 1040 | activation=leaky 1041 | 1042 | [convolutional] 1043 | batch_normalize=1 1044 | size=3 1045 | stride=1 1046 | pad=1 1047 | filters=512 1048 | activation=leaky 1049 | 1050 | [convolutional] 1051 | size=1 1052 | stride=1 1053 | pad=1 1054 | filters=21 1055 | activation=linear 1056 | 1057 | 1058 | [yolo] 1059 | mask = 3,4,5 1060 | anchors = 11,22, 24,60, 37,116, 54,186, 69,268, 89,369, 126,491, 194,314, 278,520 1061 | classes=2 1062 | num=9 1063 | jitter=.3 1064 | ignore_thresh = .7 1065 | truth_thresh = 1 1066 | random=1 1067 | scale_x_y = 1.1 1068 | iou_thresh=0.213 1069 | cls_normalizer=1.0 1070 | iou_normalizer=0.07 1071 | iou_loss=ciou 1072 | nms_kind=greedynms 1073 | beta_nms=0.6 1074 | max_delta=5 1075 | 1076 | 1077 | [route] 1078 | layers = -4 1079 | 1080 | [convolutional] 1081 | batch_normalize=1 1082 | size=3 1083 | stride=2 1084 | pad=1 1085 | filters=512 1086 | activation=leaky 1087 | 1088 | [route] 1089 | layers = -1, -37 1090 | 1091 | [convolutional] 1092 | batch_normalize=1 1093 | filters=512 1094 | size=1 1095 | stride=1 1096 | pad=1 1097 | activation=leaky 1098 | 1099 | [convolutional] 1100 | batch_normalize=1 1101 | size=3 1102 | stride=1 1103 | pad=1 1104 | filters=1024 1105 | activation=leaky 1106 | 1107 | [convolutional] 1108 | batch_normalize=1 1109 | filters=512 1110 | size=1 1111 | stride=1 1112 | pad=1 1113 | activation=leaky 1114 | 1115 | [convolutional] 1116 | batch_normalize=1 1117 | size=3 1118 | stride=1 1119 | pad=1 1120 | filters=1024 1121 | activation=leaky 1122 | 1123 | [convolutional] 1124 | batch_normalize=1 1125 | filters=512 1126 | size=1 1127 | stride=1 1128 | pad=1 1129 | activation=leaky 1130 | 1131 | [convolutional] 1132 | batch_normalize=1 1133 | size=3 1134 | stride=1 1135 | pad=1 1136 | filters=1024 1137 | activation=leaky 1138 | 1139 | [convolutional] 1140 | size=1 1141 | stride=1 1142 | pad=1 1143 | filters=21 1144 | activation=linear 1145 | 1146 | 1147 | [yolo] 1148 | mask = 6,7,8 1149 | anchors = 11,22, 24,60, 37,116, 54,186, 69,268, 89,369, 126,491, 194,314, 278,520 1150 | classes=2 1151 | num=9 1152 | jitter=.3 1153 | ignore_thresh = .7 1154 | truth_thresh = 1 1155 | random=1 1156 | scale_x_y = 1.05 1157 | iou_thresh=0.213 1158 | cls_normalizer=1.0 1159 | iou_normalizer=0.07 1160 | iou_loss=ciou 1161 | nms_kind=greedynms 1162 | beta_nms=0.6 1163 | max_delta=5 1164 | 1165 | -------------------------------------------------------------------------------- /cfg/yolov4-tiny-3l-crowdhuman-416x416.cfg: -------------------------------------------------------------------------------- 1 | [net] 2 | # Testing 3 | #batch=1 4 | #subdivisions=1 5 | # Training 6 | batch=64 7 | subdivisions=1 8 | width=416 9 | height=416 10 | channels=3 11 | momentum=0.9 12 | decay=0.0005 13 | angle=0 14 | saturation = 1.5 15 | exposure = 1.5 16 | hue=.1 17 | 18 | learning_rate=0.00261 19 | burn_in=1000 20 | max_batches = 6000 21 | policy=steps 22 | steps=4800,5400 23 | scales=.1,.1 24 | 25 | [convolutional] 26 | batch_normalize=1 27 | filters=32 28 | size=3 29 | stride=2 30 | pad=1 31 | activation=leaky 32 | 33 | [convolutional] 34 | batch_normalize=1 35 | filters=64 36 | size=3 37 | stride=2 38 | pad=1 39 | activation=leaky 40 | 41 | [convolutional] 42 | batch_normalize=1 43 | filters=64 44 | size=3 45 | stride=1 46 | pad=1 47 | activation=leaky 48 | 49 | [route] 50 | layers=-1 51 | groups=2 52 | group_id=1 53 | 54 | [convolutional] 55 | batch_normalize=1 56 | filters=32 57 | size=3 58 | stride=1 59 | pad=1 60 | activation=leaky 61 | 62 | [convolutional] 63 | batch_normalize=1 64 | filters=32 65 | size=3 66 | stride=1 67 | pad=1 68 | activation=leaky 69 | 70 | [route] 71 | layers = -1,-2 72 | 73 | [convolutional] 74 | batch_normalize=1 75 | filters=64 76 | size=1 77 | stride=1 78 | pad=1 79 | activation=leaky 80 | 81 | [route] 82 | layers = -6,-1 83 | 84 | [maxpool] 85 | size=2 86 | stride=2 87 | 88 | [convolutional] 89 | batch_normalize=1 90 | filters=128 91 | size=3 92 | stride=1 93 | pad=1 94 | activation=leaky 95 | 96 | [route] 97 | layers=-1 98 | groups=2 99 | group_id=1 100 | 101 | [convolutional] 102 | batch_normalize=1 103 | filters=64 104 | size=3 105 | stride=1 106 | pad=1 107 | activation=leaky 108 | 109 | [convolutional] 110 | batch_normalize=1 111 | filters=64 112 | size=3 113 | stride=1 114 | pad=1 115 | activation=leaky 116 | 117 | [route] 118 | layers = -1,-2 119 | 120 | [convolutional] 121 | batch_normalize=1 122 | filters=128 123 | size=1 124 | stride=1 125 | pad=1 126 | activation=leaky 127 | 128 | [route] 129 | layers = -6,-1 130 | 131 | [maxpool] 132 | size=2 133 | stride=2 134 | 135 | [convolutional] 136 | batch_normalize=1 137 | filters=256 138 | size=3 139 | stride=1 140 | pad=1 141 | activation=leaky 142 | 143 | [route] 144 | layers=-1 145 | groups=2 146 | group_id=1 147 | 148 | [convolutional] 149 | batch_normalize=1 150 | filters=128 151 | size=3 152 | stride=1 153 | pad=1 154 | activation=leaky 155 | 156 | [convolutional] 157 | batch_normalize=1 158 | filters=128 159 | size=3 160 | stride=1 161 | pad=1 162 | activation=leaky 163 | 164 | [route] 165 | layers = -1,-2 166 | 167 | [convolutional] 168 | batch_normalize=1 169 | filters=256 170 | size=1 171 | stride=1 172 | pad=1 173 | activation=leaky 174 | 175 | [route] 176 | layers = -6,-1 177 | 178 | [maxpool] 179 | size=2 180 | stride=2 181 | 182 | [convolutional] 183 | batch_normalize=1 184 | filters=512 185 | size=3 186 | stride=1 187 | pad=1 188 | activation=leaky 189 | 190 | ################################## 191 | 192 | [convolutional] 193 | batch_normalize=1 194 | filters=256 195 | size=1 196 | stride=1 197 | pad=1 198 | activation=leaky 199 | 200 | [convolutional] 201 | batch_normalize=1 202 | filters=512 203 | size=3 204 | stride=1 205 | pad=1 206 | activation=leaky 207 | 208 | [convolutional] 209 | size=1 210 | stride=1 211 | pad=1 212 | filters=21 213 | activation=linear 214 | 215 | 216 | 217 | [yolo] 218 | mask = 6,7,8 219 | anchors = 8, 15, 13, 34, 18, 75, 28, 49, 30,123, 58,106, 46,203, 80,265, 155,317 220 | classes=2 221 | num=9 222 | jitter=.3 223 | scale_x_y = 1.05 224 | cls_normalizer=1.0 225 | iou_normalizer=0.07 226 | iou_loss=ciou 227 | ignore_thresh = .7 228 | truth_thresh = 1 229 | random=0 230 | resize=1.5 231 | nms_kind=greedynms 232 | beta_nms=0.6 233 | 234 | [route] 235 | layers = -4 236 | 237 | [convolutional] 238 | batch_normalize=1 239 | filters=128 240 | size=1 241 | stride=1 242 | pad=1 243 | activation=leaky 244 | 245 | [upsample] 246 | stride=2 247 | 248 | [route] 249 | layers = -1, 23 250 | 251 | [convolutional] 252 | batch_normalize=1 253 | filters=256 254 | size=3 255 | stride=1 256 | pad=1 257 | activation=leaky 258 | 259 | [convolutional] 260 | size=1 261 | stride=1 262 | pad=1 263 | filters=21 264 | activation=linear 265 | 266 | [yolo] 267 | mask = 3,4,5 268 | anchors = 8, 15, 13, 34, 18, 75, 28, 49, 30,123, 58,106, 46,203, 80,265, 155,317 269 | classes=2 270 | num=9 271 | jitter=.3 272 | scale_x_y = 1.05 273 | cls_normalizer=1.0 274 | iou_normalizer=0.07 275 | iou_loss=ciou 276 | ignore_thresh = .7 277 | truth_thresh = 1 278 | random=0 279 | resize=1.5 280 | nms_kind=greedynms 281 | beta_nms=0.6 282 | 283 | 284 | [route] 285 | layers = -3 286 | 287 | [convolutional] 288 | batch_normalize=1 289 | filters=64 290 | size=1 291 | stride=1 292 | pad=1 293 | activation=leaky 294 | 295 | [upsample] 296 | stride=2 297 | 298 | [route] 299 | layers = -1, 15 300 | 301 | [convolutional] 302 | batch_normalize=1 303 | filters=128 304 | size=3 305 | stride=1 306 | pad=1 307 | activation=leaky 308 | 309 | [convolutional] 310 | size=1 311 | stride=1 312 | pad=1 313 | filters=21 314 | activation=linear 315 | 316 | [yolo] 317 | mask = 0,1,2 318 | anchors = 8, 15, 13, 34, 18, 75, 28, 49, 30,123, 58,106, 46,203, 80,265, 155,317 319 | classes=2 320 | num=9 321 | jitter=.3 322 | scale_x_y = 1.05 323 | cls_normalizer=1.0 324 | iou_normalizer=0.07 325 | iou_loss=ciou 326 | ignore_thresh = .7 327 | truth_thresh = 1 328 | random=0 329 | resize=1.5 330 | nms_kind=greedynms 331 | beta_nms=0.6 332 | 333 | -------------------------------------------------------------------------------- /cfg/yolov4-tiny-3l-crowdhuman-608x608.cfg: -------------------------------------------------------------------------------- 1 | [net] 2 | # Testing 3 | #batch=1 4 | #subdivisions=1 5 | # Training 6 | batch=32 7 | subdivisions=1 8 | width=608 9 | height=608 10 | channels=3 11 | momentum=0.9 12 | decay=0.0005 13 | angle=0 14 | saturation = 1.5 15 | exposure = 1.5 16 | hue=.1 17 | 18 | learning_rate=0.00261 19 | burn_in=1000 20 | max_batches = 6000 21 | policy=steps 22 | steps=4800,5400 23 | scales=.1,.1 24 | 25 | [convolutional] 26 | batch_normalize=1 27 | filters=32 28 | size=3 29 | stride=2 30 | pad=1 31 | activation=leaky 32 | 33 | [convolutional] 34 | batch_normalize=1 35 | filters=64 36 | size=3 37 | stride=2 38 | pad=1 39 | activation=leaky 40 | 41 | [convolutional] 42 | batch_normalize=1 43 | filters=64 44 | size=3 45 | stride=1 46 | pad=1 47 | activation=leaky 48 | 49 | [route] 50 | layers=-1 51 | groups=2 52 | group_id=1 53 | 54 | [convolutional] 55 | batch_normalize=1 56 | filters=32 57 | size=3 58 | stride=1 59 | pad=1 60 | activation=leaky 61 | 62 | [convolutional] 63 | batch_normalize=1 64 | filters=32 65 | size=3 66 | stride=1 67 | pad=1 68 | activation=leaky 69 | 70 | [route] 71 | layers = -1,-2 72 | 73 | [convolutional] 74 | batch_normalize=1 75 | filters=64 76 | size=1 77 | stride=1 78 | pad=1 79 | activation=leaky 80 | 81 | [route] 82 | layers = -6,-1 83 | 84 | [maxpool] 85 | size=2 86 | stride=2 87 | 88 | [convolutional] 89 | batch_normalize=1 90 | filters=128 91 | size=3 92 | stride=1 93 | pad=1 94 | activation=leaky 95 | 96 | [route] 97 | layers=-1 98 | groups=2 99 | group_id=1 100 | 101 | [convolutional] 102 | batch_normalize=1 103 | filters=64 104 | size=3 105 | stride=1 106 | pad=1 107 | activation=leaky 108 | 109 | [convolutional] 110 | batch_normalize=1 111 | filters=64 112 | size=3 113 | stride=1 114 | pad=1 115 | activation=leaky 116 | 117 | [route] 118 | layers = -1,-2 119 | 120 | [convolutional] 121 | batch_normalize=1 122 | filters=128 123 | size=1 124 | stride=1 125 | pad=1 126 | activation=leaky 127 | 128 | [route] 129 | layers = -6,-1 130 | 131 | [maxpool] 132 | size=2 133 | stride=2 134 | 135 | [convolutional] 136 | batch_normalize=1 137 | filters=256 138 | size=3 139 | stride=1 140 | pad=1 141 | activation=leaky 142 | 143 | [route] 144 | layers=-1 145 | groups=2 146 | group_id=1 147 | 148 | [convolutional] 149 | batch_normalize=1 150 | filters=128 151 | size=3 152 | stride=1 153 | pad=1 154 | activation=leaky 155 | 156 | [convolutional] 157 | batch_normalize=1 158 | filters=128 159 | size=3 160 | stride=1 161 | pad=1 162 | activation=leaky 163 | 164 | [route] 165 | layers = -1,-2 166 | 167 | [convolutional] 168 | batch_normalize=1 169 | filters=256 170 | size=1 171 | stride=1 172 | pad=1 173 | activation=leaky 174 | 175 | [route] 176 | layers = -6,-1 177 | 178 | [maxpool] 179 | size=2 180 | stride=2 181 | 182 | [convolutional] 183 | batch_normalize=1 184 | filters=512 185 | size=3 186 | stride=1 187 | pad=1 188 | activation=leaky 189 | 190 | ################################## 191 | 192 | [convolutional] 193 | batch_normalize=1 194 | filters=256 195 | size=1 196 | stride=1 197 | pad=1 198 | activation=leaky 199 | 200 | [convolutional] 201 | batch_normalize=1 202 | filters=512 203 | size=3 204 | stride=1 205 | pad=1 206 | activation=leaky 207 | 208 | [convolutional] 209 | size=1 210 | stride=1 211 | pad=1 212 | filters=21 213 | activation=linear 214 | 215 | 216 | 217 | [yolo] 218 | mask = 6,7,8 219 | anchors = 8, 15, 13, 34, 18, 75, 28, 49, 30,123, 58,106, 46,203, 80,265, 155,317 220 | classes=2 221 | num=9 222 | jitter=.3 223 | scale_x_y = 1.05 224 | cls_normalizer=1.0 225 | iou_normalizer=0.07 226 | iou_loss=ciou 227 | ignore_thresh = .7 228 | truth_thresh = 1 229 | random=0 230 | resize=1.5 231 | nms_kind=greedynms 232 | beta_nms=0.6 233 | 234 | [route] 235 | layers = -4 236 | 237 | [convolutional] 238 | batch_normalize=1 239 | filters=128 240 | size=1 241 | stride=1 242 | pad=1 243 | activation=leaky 244 | 245 | [upsample] 246 | stride=2 247 | 248 | [route] 249 | layers = -1, 23 250 | 251 | [convolutional] 252 | batch_normalize=1 253 | filters=256 254 | size=3 255 | stride=1 256 | pad=1 257 | activation=leaky 258 | 259 | [convolutional] 260 | size=1 261 | stride=1 262 | pad=1 263 | filters=21 264 | activation=linear 265 | 266 | [yolo] 267 | mask = 3,4,5 268 | anchors = 8, 15, 13, 34, 18, 75, 28, 49, 30,123, 58,106, 46,203, 80,265, 155,317 269 | classes=2 270 | num=9 271 | jitter=.3 272 | scale_x_y = 1.05 273 | cls_normalizer=1.0 274 | iou_normalizer=0.07 275 | iou_loss=ciou 276 | ignore_thresh = .7 277 | truth_thresh = 1 278 | random=0 279 | resize=1.5 280 | nms_kind=greedynms 281 | beta_nms=0.6 282 | 283 | 284 | [route] 285 | layers = -3 286 | 287 | [convolutional] 288 | batch_normalize=1 289 | filters=64 290 | size=1 291 | stride=1 292 | pad=1 293 | activation=leaky 294 | 295 | [upsample] 296 | stride=2 297 | 298 | [route] 299 | layers = -1, 15 300 | 301 | [convolutional] 302 | batch_normalize=1 303 | filters=128 304 | size=3 305 | stride=1 306 | pad=1 307 | activation=leaky 308 | 309 | [convolutional] 310 | size=1 311 | stride=1 312 | pad=1 313 | filters=21 314 | activation=linear 315 | 316 | [yolo] 317 | mask = 0,1,2 318 | anchors = 8, 15, 13, 34, 18, 75, 28, 49, 30,123, 58,106, 46,203, 80,265, 155,317 319 | classes=2 320 | num=9 321 | jitter=.3 322 | scale_x_y = 1.05 323 | cls_normalizer=1.0 324 | iou_normalizer=0.07 325 | iou_loss=ciou 326 | ignore_thresh = .7 327 | truth_thresh = 1 328 | random=0 329 | resize=1.5 330 | nms_kind=greedynms 331 | beta_nms=0.6 332 | 333 | -------------------------------------------------------------------------------- /cfg/yolov4-tiny-crowdhuman-416x416.cfg: -------------------------------------------------------------------------------- 1 | [net] 2 | # Testing 3 | #batch=1 4 | #subdivisions=1 5 | # Training 6 | batch=64 7 | subdivisions=1 8 | width=416 9 | height=416 10 | channels=3 11 | momentum=0.9 12 | decay=0.0005 13 | angle=0 14 | saturation = 1.5 15 | exposure = 1.5 16 | hue=.1 17 | 18 | learning_rate=0.00261 19 | burn_in=1000 20 | 21 | max_batches = 6000 22 | policy=steps 23 | steps=4800,5400 24 | scales=.1,.1 25 | 26 | 27 | #weights_reject_freq=1001 28 | #ema_alpha=0.9998 29 | #equidistant_point=1000 30 | #num_sigmas_reject_badlabels=3 31 | #badlabels_rejection_percentage=0.2 32 | 33 | 34 | [convolutional] 35 | batch_normalize=1 36 | filters=32 37 | size=3 38 | stride=2 39 | pad=1 40 | activation=leaky 41 | 42 | [convolutional] 43 | batch_normalize=1 44 | filters=64 45 | size=3 46 | stride=2 47 | pad=1 48 | activation=leaky 49 | 50 | [convolutional] 51 | batch_normalize=1 52 | filters=64 53 | size=3 54 | stride=1 55 | pad=1 56 | activation=leaky 57 | 58 | [route] 59 | layers=-1 60 | groups=2 61 | group_id=1 62 | 63 | [convolutional] 64 | batch_normalize=1 65 | filters=32 66 | size=3 67 | stride=1 68 | pad=1 69 | activation=leaky 70 | 71 | [convolutional] 72 | batch_normalize=1 73 | filters=32 74 | size=3 75 | stride=1 76 | pad=1 77 | activation=leaky 78 | 79 | [route] 80 | layers = -1,-2 81 | 82 | [convolutional] 83 | batch_normalize=1 84 | filters=64 85 | size=1 86 | stride=1 87 | pad=1 88 | activation=leaky 89 | 90 | [route] 91 | layers = -6,-1 92 | 93 | [maxpool] 94 | size=2 95 | stride=2 96 | 97 | [convolutional] 98 | batch_normalize=1 99 | filters=128 100 | size=3 101 | stride=1 102 | pad=1 103 | activation=leaky 104 | 105 | [route] 106 | layers=-1 107 | groups=2 108 | group_id=1 109 | 110 | [convolutional] 111 | batch_normalize=1 112 | filters=64 113 | size=3 114 | stride=1 115 | pad=1 116 | activation=leaky 117 | 118 | [convolutional] 119 | batch_normalize=1 120 | filters=64 121 | size=3 122 | stride=1 123 | pad=1 124 | activation=leaky 125 | 126 | [route] 127 | layers = -1,-2 128 | 129 | [convolutional] 130 | batch_normalize=1 131 | filters=128 132 | size=1 133 | stride=1 134 | pad=1 135 | activation=leaky 136 | 137 | [route] 138 | layers = -6,-1 139 | 140 | [maxpool] 141 | size=2 142 | stride=2 143 | 144 | [convolutional] 145 | batch_normalize=1 146 | filters=256 147 | size=3 148 | stride=1 149 | pad=1 150 | activation=leaky 151 | 152 | [route] 153 | layers=-1 154 | groups=2 155 | group_id=1 156 | 157 | [convolutional] 158 | batch_normalize=1 159 | filters=128 160 | size=3 161 | stride=1 162 | pad=1 163 | activation=leaky 164 | 165 | [convolutional] 166 | batch_normalize=1 167 | filters=128 168 | size=3 169 | stride=1 170 | pad=1 171 | activation=leaky 172 | 173 | [route] 174 | layers = -1,-2 175 | 176 | [convolutional] 177 | batch_normalize=1 178 | filters=256 179 | size=1 180 | stride=1 181 | pad=1 182 | activation=leaky 183 | 184 | [route] 185 | layers = -6,-1 186 | 187 | [maxpool] 188 | size=2 189 | stride=2 190 | 191 | [convolutional] 192 | batch_normalize=1 193 | filters=512 194 | size=3 195 | stride=1 196 | pad=1 197 | activation=leaky 198 | 199 | ################################## 200 | 201 | [convolutional] 202 | batch_normalize=1 203 | filters=256 204 | size=1 205 | stride=1 206 | pad=1 207 | activation=leaky 208 | 209 | [convolutional] 210 | batch_normalize=1 211 | filters=512 212 | size=3 213 | stride=1 214 | pad=1 215 | activation=leaky 216 | 217 | [convolutional] 218 | size=1 219 | stride=1 220 | pad=1 221 | filters=21 222 | activation=linear 223 | 224 | 225 | 226 | [yolo] 227 | mask = 3,4,5 228 | anchors = 7, 13, 14, 36, 26, 80, 41,156, 69,241, 140,311 229 | classes=2 230 | num=6 231 | jitter=.3 232 | scale_x_y = 1.05 233 | cls_normalizer=1.0 234 | iou_normalizer=0.07 235 | iou_loss=ciou 236 | ignore_thresh = .7 237 | truth_thresh = 1 238 | random=0 239 | resize=1.5 240 | nms_kind=greedynms 241 | beta_nms=0.6 242 | #new_coords=1 243 | #scale_x_y = 2.0 244 | 245 | [route] 246 | layers = -4 247 | 248 | [convolutional] 249 | batch_normalize=1 250 | filters=128 251 | size=1 252 | stride=1 253 | pad=1 254 | activation=leaky 255 | 256 | [upsample] 257 | stride=2 258 | 259 | [route] 260 | layers = -1, 23 261 | 262 | [convolutional] 263 | batch_normalize=1 264 | filters=256 265 | size=3 266 | stride=1 267 | pad=1 268 | activation=leaky 269 | 270 | [convolutional] 271 | size=1 272 | stride=1 273 | pad=1 274 | filters=21 275 | activation=linear 276 | 277 | [yolo] 278 | mask = 1,2,3 279 | anchors = 7, 13, 14, 36, 26, 80, 41,156, 69,241, 140,311 280 | classes=2 281 | num=6 282 | jitter=.3 283 | scale_x_y = 1.05 284 | cls_normalizer=1.0 285 | iou_normalizer=0.07 286 | iou_loss=ciou 287 | ignore_thresh = .7 288 | truth_thresh = 1 289 | random=0 290 | resize=1.5 291 | nms_kind=greedynms 292 | beta_nms=0.6 293 | #new_coords=1 294 | #scale_x_y = 2.0 295 | -------------------------------------------------------------------------------- /cfg/yolov4-tiny-crowdhuman-608x608.cfg: -------------------------------------------------------------------------------- 1 | [net] 2 | # Testing 3 | #batch=1 4 | #subdivisions=1 5 | # Training 6 | batch=32 7 | subdivisions=1 8 | width=608 9 | height=608 10 | channels=3 11 | momentum=0.9 12 | decay=0.0005 13 | angle=0 14 | saturation = 1.5 15 | exposure = 1.5 16 | hue=.1 17 | 18 | learning_rate=0.00261 19 | burn_in=1000 20 | 21 | max_batches = 6000 22 | policy=steps 23 | steps=4800,5400 24 | scales=.1,.1 25 | 26 | 27 | #weights_reject_freq=1001 28 | #ema_alpha=0.9998 29 | #equidistant_point=1000 30 | #num_sigmas_reject_badlabels=3 31 | #badlabels_rejection_percentage=0.2 32 | 33 | 34 | [convolutional] 35 | batch_normalize=1 36 | filters=32 37 | size=3 38 | stride=2 39 | pad=1 40 | activation=leaky 41 | 42 | [convolutional] 43 | batch_normalize=1 44 | filters=64 45 | size=3 46 | stride=2 47 | pad=1 48 | activation=leaky 49 | 50 | [convolutional] 51 | batch_normalize=1 52 | filters=64 53 | size=3 54 | stride=1 55 | pad=1 56 | activation=leaky 57 | 58 | [route] 59 | layers=-1 60 | groups=2 61 | group_id=1 62 | 63 | [convolutional] 64 | batch_normalize=1 65 | filters=32 66 | size=3 67 | stride=1 68 | pad=1 69 | activation=leaky 70 | 71 | [convolutional] 72 | batch_normalize=1 73 | filters=32 74 | size=3 75 | stride=1 76 | pad=1 77 | activation=leaky 78 | 79 | [route] 80 | layers = -1,-2 81 | 82 | [convolutional] 83 | batch_normalize=1 84 | filters=64 85 | size=1 86 | stride=1 87 | pad=1 88 | activation=leaky 89 | 90 | [route] 91 | layers = -6,-1 92 | 93 | [maxpool] 94 | size=2 95 | stride=2 96 | 97 | [convolutional] 98 | batch_normalize=1 99 | filters=128 100 | size=3 101 | stride=1 102 | pad=1 103 | activation=leaky 104 | 105 | [route] 106 | layers=-1 107 | groups=2 108 | group_id=1 109 | 110 | [convolutional] 111 | batch_normalize=1 112 | filters=64 113 | size=3 114 | stride=1 115 | pad=1 116 | activation=leaky 117 | 118 | [convolutional] 119 | batch_normalize=1 120 | filters=64 121 | size=3 122 | stride=1 123 | pad=1 124 | activation=leaky 125 | 126 | [route] 127 | layers = -1,-2 128 | 129 | [convolutional] 130 | batch_normalize=1 131 | filters=128 132 | size=1 133 | stride=1 134 | pad=1 135 | activation=leaky 136 | 137 | [route] 138 | layers = -6,-1 139 | 140 | [maxpool] 141 | size=2 142 | stride=2 143 | 144 | [convolutional] 145 | batch_normalize=1 146 | filters=256 147 | size=3 148 | stride=1 149 | pad=1 150 | activation=leaky 151 | 152 | [route] 153 | layers=-1 154 | groups=2 155 | group_id=1 156 | 157 | [convolutional] 158 | batch_normalize=1 159 | filters=128 160 | size=3 161 | stride=1 162 | pad=1 163 | activation=leaky 164 | 165 | [convolutional] 166 | batch_normalize=1 167 | filters=128 168 | size=3 169 | stride=1 170 | pad=1 171 | activation=leaky 172 | 173 | [route] 174 | layers = -1,-2 175 | 176 | [convolutional] 177 | batch_normalize=1 178 | filters=256 179 | size=1 180 | stride=1 181 | pad=1 182 | activation=leaky 183 | 184 | [route] 185 | layers = -6,-1 186 | 187 | [maxpool] 188 | size=2 189 | stride=2 190 | 191 | [convolutional] 192 | batch_normalize=1 193 | filters=512 194 | size=3 195 | stride=1 196 | pad=1 197 | activation=leaky 198 | 199 | ################################## 200 | 201 | [convolutional] 202 | batch_normalize=1 203 | filters=256 204 | size=1 205 | stride=1 206 | pad=1 207 | activation=leaky 208 | 209 | [convolutional] 210 | batch_normalize=1 211 | filters=512 212 | size=3 213 | stride=1 214 | pad=1 215 | activation=leaky 216 | 217 | [convolutional] 218 | size=1 219 | stride=1 220 | pad=1 221 | filters=21 222 | activation=linear 223 | 224 | 225 | 226 | [yolo] 227 | mask = 3,4,5 228 | anchors = 7, 13, 14, 36, 26, 80, 41,156, 69,241, 140,311 229 | classes=2 230 | num=6 231 | jitter=.3 232 | scale_x_y = 1.05 233 | cls_normalizer=1.0 234 | iou_normalizer=0.07 235 | iou_loss=ciou 236 | ignore_thresh = .7 237 | truth_thresh = 1 238 | random=0 239 | resize=1.5 240 | nms_kind=greedynms 241 | beta_nms=0.6 242 | #new_coords=1 243 | #scale_x_y = 2.0 244 | 245 | [route] 246 | layers = -4 247 | 248 | [convolutional] 249 | batch_normalize=1 250 | filters=128 251 | size=1 252 | stride=1 253 | pad=1 254 | activation=leaky 255 | 256 | [upsample] 257 | stride=2 258 | 259 | [route] 260 | layers = -1, 23 261 | 262 | [convolutional] 263 | batch_normalize=1 264 | filters=256 265 | size=3 266 | stride=1 267 | pad=1 268 | activation=leaky 269 | 270 | [convolutional] 271 | size=1 272 | stride=1 273 | pad=1 274 | filters=21 275 | activation=linear 276 | 277 | [yolo] 278 | mask = 1,2,3 279 | anchors = 7, 13, 14, 36, 26, 80, 41,156, 69,241, 140,311 280 | classes=2 281 | num=6 282 | jitter=.3 283 | scale_x_y = 1.05 284 | cls_normalizer=1.0 285 | iou_normalizer=0.07 286 | iou_loss=ciou 287 | ignore_thresh = .7 288 | truth_thresh = 1 289 | random=0 290 | resize=1.5 291 | nms_kind=greedynms 292 | beta_nms=0.6 293 | #new_coords=1 294 | #scale_x_y = 2.0 295 | -------------------------------------------------------------------------------- /data/README.md: -------------------------------------------------------------------------------- 1 | # CrowdHuman Dataset by MEGVII 2 | 3 | * Official web site: [https://www.crowdhuman.org/](https://www.crowdhuman.org/) 4 | 5 | * Reference: 6 | - [CrowdHuman: A Benchmark for Detecting Human in a Crowd](https://arxiv.org/abs/1805.00123) 7 | - [CrowdHuman Dataset 介紹](https://chtseng.wordpress.com/2019/12/13/crowdhuman-dataset-%E4%BB%8B%E7%B4%B9/) 8 | 9 | * When converting CrowdHuman annotations to YOLO txt files, 10 | - I discard all "mask" objects. The "mask" objects in the CrowdHuman dataset are not real humans. They are usually reflections of humans, or pictures of humans in billboards or advertisement posters. 11 | - I use "hbox" (head) and "fbox" (full body) annotations of all "person" objects. Note that the "fbox" annotation might include body parts which are "ocluded" in the scene. 12 | - In the final YOLO txt files, there are 2 classes of objects. Class 0 is "head", and class 1 "person". 13 | -------------------------------------------------------------------------------- /data/crowdhuman-template.data: -------------------------------------------------------------------------------- 1 | classes = 2 2 | train = data/crowdhuman-{width}x{height}/train.txt 3 | valid = data/crowdhuman-{width}x{height}/test.txt 4 | names = data/crowdhuman.names 5 | backup = backup/ 6 | -------------------------------------------------------------------------------- /data/crowdhuman.names: -------------------------------------------------------------------------------- 1 | head 2 | person 3 | -------------------------------------------------------------------------------- /data/gen_txts.py: -------------------------------------------------------------------------------- 1 | """gen_txts.py 2 | 3 | To generate YOLO txt files from the original CrowdHuman annotations. 4 | Please also refer to README.md in this directory. 5 | 6 | Inputs: 7 | * raw/annotation_train.odgt 8 | * raw/annotation_val.odgt 9 | * crowdhuman-{width}x{height}/[IDs].jpg 10 | 11 | Outputs: 12 | * crowdhuman-{width}x{height}train.txt 13 | * crowdhuman-{width}x{height}/test.txt 14 | * crowdhuman-{width}x{height}/[IDs].txt (one annotation for each image in the training or test set) 15 | """ 16 | 17 | 18 | import json 19 | from pathlib import Path 20 | from argparse import ArgumentParser 21 | 22 | import numpy as np 23 | import cv2 24 | 25 | 26 | # input image width/height of the yolov4 model, set by command-line argument 27 | INPUT_WIDTH = 0 28 | INPUT_HEIGHT = 0 29 | 30 | # Minimum width/height of objects for detection (don't learn from 31 | # objects smaller than these 32 | MIN_W = 5 33 | MIN_H = 5 34 | 35 | # Do K-Means clustering in order to determine "anchor" sizes 36 | DO_KMEANS = True 37 | KMEANS_CLUSTERS = 9 38 | BBOX_WHS = [] # keep track of bbox width/height with respect to 608x608 39 | 40 | 41 | def image_shape(ID, image_dir): 42 | assert image_dir is not None 43 | jpg_path = image_dir / ('%s.jpg' % ID) 44 | img = cv2.imread(jpg_path.as_posix()) 45 | return img.shape 46 | 47 | 48 | def txt_line(cls, bbox, img_w, img_h): 49 | """Generate 1 line in the txt file.""" 50 | assert INPUT_WIDTH > 0 and INPUT_HEIGHT > 0 51 | x, y, w, h = bbox 52 | x = max(int(x), 0) 53 | y = max(int(y), 0) 54 | w = min(int(w), img_w - x) 55 | h = min(int(h), img_h - y) 56 | w_rescaled = float(w) * INPUT_WIDTH / img_w 57 | h_rescaled = float(h) * INPUT_HEIGHT / img_h 58 | if w_rescaled < MIN_W or h_rescaled < MIN_H: 59 | return '' 60 | else: 61 | if DO_KMEANS: 62 | global BBOX_WHS 63 | BBOX_WHS.append((w_rescaled, h_rescaled)) 64 | cx = (x + w / 2.) / img_w 65 | cy = (y + h / 2.) / img_h 66 | nw = float(w) / img_w 67 | nh = float(h) / img_h 68 | return '%d %.6f %.6f %.6f %.6f\n' % (cls, cx, cy, nw, nh) 69 | 70 | 71 | def process(set_='test', annotation_filename='raw/annotation_val.odgt', 72 | output_dir=None): 73 | """Process either 'train' or 'test' set.""" 74 | assert output_dir is not None 75 | output_dir.mkdir(exist_ok=True) 76 | jpgs = [] 77 | with open(annotation_filename, 'r') as fanno: 78 | for raw_anno in fanno.readlines(): 79 | anno = json.loads(raw_anno) 80 | ID = anno['ID'] # e.g. '273271,c9db000d5146c15' 81 | print('Processing ID: %s' % ID) 82 | img_h, img_w, img_c = image_shape(ID, output_dir) 83 | assert img_c == 3 # should be a BGR image 84 | txt_path = output_dir / ('%s.txt' % ID) 85 | # write a txt for each image 86 | with open(txt_path.as_posix(), 'w') as ftxt: 87 | for obj in anno['gtboxes']: 88 | if obj['tag'] == 'mask': 89 | continue # ignore non-human 90 | assert obj['tag'] == 'person' 91 | if 'hbox' in obj.keys(): # head 92 | line = txt_line(0, obj['hbox'], img_w, img_h) 93 | if line: 94 | ftxt.write(line) 95 | if 'fbox' in obj.keys(): # full body 96 | line = txt_line(1, obj['fbox'], img_w, img_h) 97 | if line: 98 | ftxt.write(line) 99 | jpgs.append('data/%s/%s.jpg' % (output_dir, ID)) 100 | # write the 'data/crowdhuman/train.txt' or 'data/crowdhuman/test.txt' 101 | set_path = output_dir / ('%s.txt' % set_) 102 | with open(set_path.as_posix(), 'w') as fset: 103 | for jpg in jpgs: 104 | fset.write('%s\n' % jpg) 105 | 106 | 107 | def rm_txts(output_dir): 108 | """Remove txt files in output_dir.""" 109 | for txt in output_dir.glob('*.txt'): 110 | if txt.is_file(): 111 | txt.unlink() 112 | 113 | 114 | def main(): 115 | global INPUT_WIDTH, INPUT_HEIGHT 116 | 117 | parser = ArgumentParser() 118 | parser.add_argument('dim', help='input width and height, e.g. 608x608') 119 | args = parser.parse_args() 120 | 121 | dim_split = args.dim.split('x') 122 | if len(dim_split) != 2: 123 | raise SystemExit('ERROR: bad spec of input dim (%s)' % args.dim) 124 | INPUT_WIDTH, INPUT_HEIGHT = int(dim_split[0]), int(dim_split[1]) 125 | if INPUT_WIDTH % 32 != 0 or INPUT_HEIGHT % 32 != 0: 126 | raise SystemExit('ERROR: bad spec of input dim (%s)' % args.dim) 127 | 128 | output_dir = Path('crowdhuman-%s' % args.dim) 129 | if not output_dir.is_dir(): 130 | raise SystemExit('ERROR: %s does not exist.' % output_dir.as_posix()) 131 | 132 | rm_txts(output_dir) 133 | process('test', 'raw/annotation_val.odgt', output_dir) 134 | process('train', 'raw/annotation_train.odgt', output_dir) 135 | 136 | with open('crowdhuman-%s.data' % args.dim, 'w') as f: 137 | f.write("""classes = 2 138 | train = data/crowdhuman-%s/train.txt 139 | valid = data/crowdhuman-%s/test.txt 140 | names = data/crowdhuman.names 141 | backup = backup/\n""" % (args.dim, args.dim)) 142 | 143 | if DO_KMEANS: 144 | try: 145 | from sklearn.cluster import KMeans 146 | except ModuleNotFoundError: 147 | print('WARNING: no sklearn, skipping anchor clustering...') 148 | else: 149 | X = np.array(BBOX_WHS) 150 | kmeans = KMeans(n_clusters=KMEANS_CLUSTERS, random_state=0).fit(X) 151 | centers = kmeans.cluster_centers_ 152 | centers = centers[centers[:, 0].argsort()] # sort by bbox w 153 | print('\n** for yolov4-%dx%d, ' % (INPUT_WIDTH, INPUT_HEIGHT), end='') 154 | print('resized bbox width/height clusters are: ', end='') 155 | print(' '.join(['(%.2f, %.2f)' % (c[0], c[1]) for c in centers])) 156 | print('\nanchors = ', end='') 157 | print(', '.join(['%d,%d' % (int(c[0]), int(c[1])) for c in centers])) 158 | 159 | 160 | if __name__ == '__main__': 161 | main() 162 | -------------------------------------------------------------------------------- /data/image_histogram.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from pathlib import Path\n", 10 | "\n", 11 | "import numpy as np\n", 12 | "import cv2\n", 13 | "from matplotlib import pyplot as plt\n", 14 | "\n", 15 | "%matplotlib inline" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 2, 21 | "metadata": {}, 22 | "outputs": [ 23 | { 24 | "name": "stdout", 25 | "output_type": "stream", 26 | "text": [ 27 | "Processing images 0/19370\n", 28 | "Processing images 1000/19370\n", 29 | "Processing images 2000/19370\n", 30 | "Processing images 3000/19370\n", 31 | "Processing images 4000/19370\n", 32 | "Processing images 5000/19370\n", 33 | "Processing images 6000/19370\n", 34 | "Processing images 7000/19370\n", 35 | "Processing images 8000/19370\n", 36 | "Processing images 9000/19370\n", 37 | "Processing images 10000/19370\n", 38 | "Processing images 11000/19370\n", 39 | "Processing images 12000/19370\n", 40 | "Processing images 13000/19370\n", 41 | "Processing images 14000/19370\n", 42 | "Processing images 15000/19370\n", 43 | "Processing images 16000/19370\n", 44 | "Processing images 17000/19370\n", 45 | "Processing images 18000/19370\n", 46 | "Processing images 19000/19370\n", 47 | "Processing images 19369/19370\n" 48 | ] 49 | } 50 | ], 51 | "source": [ 52 | "jpg_paths = list(Path('raw/Images').rglob('*.jpg'))\n", 53 | "img_widths, img_heights = [], []\n", 54 | "for i, jpg_path in enumerate(jpg_paths):\n", 55 | " if i % 1000 == 0 or i == len(jpg_paths) - 1:\n", 56 | " print('Processing images %d/%d' % (i, len(jpg_paths)))\n", 57 | " img = cv2.imread(jpg_path.as_posix())\n", 58 | " assert img is not None\n", 59 | " img_h, img_w, img_c = img.shape\n", 60 | " assert img_c == 3\n", 61 | " img_widths.append(img_w)\n", 62 | " img_heights.append(img_h)\n", 63 | "\n", 64 | "img_widths = np.array(img_widths)\n", 65 | "img_heights = np.array(img_heights)" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 3, 71 | "metadata": {}, 72 | "outputs": [ 73 | { 74 | "name": "stdout", 75 | "output_type": "stream", 76 | "text": [ 77 | "image with min width ( 400): 273271,270ce0009b574b4f.jpg\n", 78 | "image with max width (10800): 283081,16bc500013036fc4.jpg\n", 79 | "image with min height ( 300): 273278,75ad1000895e69f8.jpg\n", 80 | "image with max height ( 7200): 283081,16bc500013036fc4.jpg\n", 81 | "min aspect ratio (0.36900): 283554,158f20008da98dbc.jpg\n", 82 | "max aspect ratio (5.60440): 273278,11efb10008ff5dbd4.jpg\n" 83 | ] 84 | } 85 | ], 86 | "source": [ 87 | "img_aspects = img_widths / img_heights\n", 88 | "\n", 89 | "idx = img_widths.argmin()\n", 90 | "print('image with min width (%5d): %s' % (img_widths[idx], jpg_paths[idx].name))\n", 91 | "idx = img_widths.argmax()\n", 92 | "print('image with max width (%5d): %s' % (img_widths[idx], jpg_paths[idx].name))\n", 93 | "idx = img_heights.argmin()\n", 94 | "print('image with min height (%5d): %s' % (img_heights[idx], jpg_paths[idx].name))\n", 95 | "idx = img_heights.argmax()\n", 96 | "print('image with max height (%5d): %s' % (img_heights[idx], jpg_paths[idx].name))\n", 97 | "idx = img_aspects.argmin()\n", 98 | "print('min aspect ratio (%7.5f): %s' % (img_aspects[idx], jpg_paths[idx].name))\n", 99 | "idx = img_aspects.argmax()\n", 100 | "print('max aspect ratio (%7.5f): %s' % (img_aspects[idx], jpg_paths[idx].name))" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 4, 106 | "metadata": {}, 107 | "outputs": [ 108 | { 109 | "data": { 110 | "image/png": "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\n", 111 | "text/plain": [ 112 | "
" 113 | ] 114 | }, 115 | "metadata": { 116 | "needs_background": "light" 117 | }, 118 | "output_type": "display_data" 119 | } 120 | ], 121 | "source": [ 122 | "plt.figure(figsize=(12, 6))\n", 123 | "plt.subplot(1, 2, 1)\n", 124 | "plt.hist(img_widths)\n", 125 | "plt.title('image widths')\n", 126 | "plt.subplot(1, 2, 2)\n", 127 | "plt.hist(img_heights)\n", 128 | "plt.title('image heights')\n", 129 | "plt.tight_layout()\n", 130 | "plt.show()" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": 5, 136 | "metadata": {}, 137 | "outputs": [ 138 | { 139 | "data": { 140 | "image/png": "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\n", 141 | "text/plain": [ 142 | "
" 143 | ] 144 | }, 145 | "metadata": { 146 | "needs_background": "light" 147 | }, 148 | "output_type": "display_data" 149 | } 150 | ], 151 | "source": [ 152 | "plt.figure(figsize=(10, 10))\n", 153 | "\n", 154 | "plt.subplot(1, 1, 1)\n", 155 | "plt.scatter(img_widths, img_heights)\n", 156 | "plt.title('image widths/heights')\n", 157 | "plt.xlabel('width')\n", 158 | "plt.ylabel('height')\n", 159 | "\n", 160 | "plt.show()" 161 | ] 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": null, 166 | "metadata": {}, 167 | "outputs": [], 168 | "source": [] 169 | } 170 | ], 171 | "metadata": { 172 | "kernelspec": { 173 | "display_name": "Python 3", 174 | "language": "python", 175 | "name": "python3" 176 | }, 177 | "language_info": { 178 | "codemirror_mode": { 179 | "name": "ipython", 180 | "version": 3 181 | }, 182 | "file_extension": ".py", 183 | "mimetype": "text/x-python", 184 | "name": "python", 185 | "nbconvert_exporter": "python", 186 | "pygments_lexer": "ipython3", 187 | "version": "3.6.9" 188 | } 189 | }, 190 | "nbformat": 4, 191 | "nbformat_minor": 4 192 | } 193 | -------------------------------------------------------------------------------- /data/prepare_data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | # check argument 6 | if [[ -z $1 || ! $1 =~ [[:digit:]]x[[:digit:]] ]]; then 7 | echo "ERROR: This script requires 1 argument, \"input dimension\" of the YOLO model." 8 | echo "The input dimension should be {width}x{height} such as 608x608 or 416x256.". 9 | exit 1 10 | fi 11 | 12 | if which python3 > /dev/null; then 13 | PYTHON=python3 14 | else 15 | PYTHON=python 16 | fi 17 | 18 | echo "** Install requirements" 19 | # "gdown" is for downloading files from GoogleDrive 20 | pip3 install --user gdown > /dev/null 21 | 22 | # make sure to download dataset files to "yolov4_crowdhuman/data/raw/" 23 | mkdir -p $(dirname $0)/raw 24 | pushd $(dirname $0)/raw > /dev/null 25 | 26 | get_file() 27 | { 28 | # do download only if the file does not exist 29 | if [[ -f $2 ]]; then 30 | echo Skipping $2 31 | else 32 | echo Downloading $2... 33 | python3 -m gdown.cli $1 34 | fi 35 | } 36 | 37 | echo "** Download dataset files" 38 | get_file https://drive.google.com/uc?id=134QOvaatwKdy0iIeNqA_p-xkAhkV4F8Y CrowdHuman_train01.zip 39 | get_file https://drive.google.com/uc?id=17evzPh7gc1JBNvnW1ENXLy5Kr4Q_Nnla CrowdHuman_train02.zip 40 | get_file https://drive.google.com/uc?id=1tdp0UCgxrqy1B6p8LkR-Iy0aIJ8l4fJW CrowdHuman_train03.zip 41 | get_file https://drive.google.com/uc?id=18jFI789CoHTppQ7vmRSFEdnGaSQZ4YzO CrowdHuman_val.zip 42 | # test data is not needed... 43 | # get_file https://drive.google.com/uc?id=1tQG3E_RrRI4wIGskorLTmDiWHH2okVvk CrowdHuman_test.zip 44 | get_file https://drive.google.com/u/0/uc?id=1UUTea5mYqvlUObsC1Z8CFldHJAtLtMX3 annotation_train.odgt 45 | get_file https://drive.google.com/u/0/uc?id=10WIRwu8ju8GRLuCkZ_vT6hnNxs5ptwoL annotation_val.odgt 46 | 47 | # unzip image files (ignore CrowdHuman_test.zip for now) 48 | echo "** Unzip dataset files" 49 | for f in CrowdHuman_train01.zip CrowdHuman_train02.zip CrowdHuman_train03.zip CrowdHuman_val.zip ; do 50 | unzip -n ${f} 51 | done 52 | 53 | echo "** Create the crowdhuman-$1/ subdirectory" 54 | rm -rf ../crowdhuman-$1/ 55 | mkdir ../crowdhuman-$1/ 56 | ln Images/*.jpg ../crowdhuman-$1/ 57 | 58 | # the crowdhuman/ subdirectory now contains all train/val jpg images 59 | 60 | echo "** Generate yolo txt files" 61 | cd .. 62 | ${PYTHON} gen_txts.py $1 63 | 64 | popd > /dev/null 65 | 66 | echo "** Done." 67 | -------------------------------------------------------------------------------- /data/verify_txts.py: -------------------------------------------------------------------------------- 1 | """verify_txts.py 2 | 3 | For verifying correctness of the generated YOLO txt annotations. 4 | """ 5 | 6 | 7 | import random 8 | from pathlib import Path 9 | from argparse import ArgumentParser 10 | 11 | import cv2 12 | 13 | 14 | WINDOW_NAME = "verify_txts" 15 | 16 | parser = ArgumentParser() 17 | parser.add_argument('dim', help='input width and height, e.g. 608x608') 18 | args = parser.parse_args() 19 | 20 | if random.random() < 0.5: 21 | print('Verifying test.txt') 22 | jpgs_path = Path('crowdhuman-%s/test.txt' % args.dim) 23 | else: 24 | print('Verifying train.txt') 25 | jpgs_path = Path('crowdhuman-%s/train.txt' % args.dim) 26 | 27 | with open(jpgs_path.as_posix(), 'r') as f: 28 | jpg_names = [l.strip()[5:] for l in f.readlines()] 29 | 30 | random.shuffle(jpg_names) 31 | for jpg_name in jpg_names: 32 | img = cv2.imread(jpg_name) 33 | img_h, img_w, _ = img.shape 34 | txt_name = jpg_name.replace('.jpg', '.txt') 35 | with open(txt_name, 'r') as f: 36 | obj_lines = [l.strip() for l in f.readlines()] 37 | for obj_line in obj_lines: 38 | cls, cx, cy, nw, nh = [float(item) for item in obj_line.split(' ')] 39 | color = (0, 0, 255) if cls == 0.0 else (0, 255, 0) 40 | x_min = int((cx - (nw / 2.0)) * img_w) 41 | y_min = int((cy - (nh / 2.0)) * img_h) 42 | x_max = int((cx + (nw / 2.0)) * img_w) 43 | y_max = int((cy + (nh / 2.0)) * img_h) 44 | cv2.rectangle(img, (x_min, y_min), (x_max, y_max), color, 2) 45 | cv2.imshow(WINDOW_NAME, img) 46 | if cv2.waitKey(0) == 27: 47 | break 48 | 49 | cv2.destroyAllWindows() 50 | -------------------------------------------------------------------------------- /doc/cant_connect_gpu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/374b0e839e062d2039259ca18f3490f39cd122a8/doc/cant_connect_gpu.jpg -------------------------------------------------------------------------------- /doc/chart_yolov4-crowdhuman-608x608.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/374b0e839e062d2039259ca18f3490f39cd122a8/doc/chart_yolov4-crowdhuman-608x608.png -------------------------------------------------------------------------------- /doc/chart_yolov4-tiny-3l-crowdhuman-416x416.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/374b0e839e062d2039259ca18f3490f39cd122a8/doc/chart_yolov4-tiny-3l-crowdhuman-416x416.png -------------------------------------------------------------------------------- /doc/chart_yolov4-tiny-crowdhuman-608x608.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/374b0e839e062d2039259ca18f3490f39cd122a8/doc/chart_yolov4-tiny-crowdhuman-608x608.png -------------------------------------------------------------------------------- /doc/crowdhuman_sample.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/374b0e839e062d2039259ca18f3490f39cd122a8/doc/crowdhuman_sample.jpg -------------------------------------------------------------------------------- /doc/drive_on_colab.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/374b0e839e062d2039259ca18f3490f39cd122a8/doc/drive_on_colab.jpg -------------------------------------------------------------------------------- /doc/infinity_war.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/374b0e839e062d2039259ca18f3490f39cd122a8/doc/infinity_war.jpg -------------------------------------------------------------------------------- /doc/predictions_sample.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/374b0e839e062d2039259ca18f3490f39cd122a8/doc/predictions_sample.jpg -------------------------------------------------------------------------------- /doc/save_a_copy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jkjung-avt/yolov4_crowdhuman/374b0e839e062d2039259ca18f3490f39cd122a8/doc/save_a_copy.jpg -------------------------------------------------------------------------------- /prepare_training.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | # check argument 6 | if [[ -z $1 || ! $1 =~ [[:digit:]]x[[:digit:]] ]]; then 7 | echo "ERROR: This script requires 1 argument, \"input dimension\" of the YOLO model." 8 | echo "The input dimension should be {width}x{height} such as 608x608 or 416x256.". 9 | exit 1 10 | fi 11 | 12 | CROWDHUMAN=crowdhuman-$1 13 | 14 | if [[ ! -f data/${CROWDHUMAN}/train.txt || ! -f data/${CROWDHUMAN}/test.txt ]]; then 15 | echo "ERROR: missing txt file in data/${CROWDHUMAN}/" 16 | exit 1 17 | fi 18 | 19 | echo "** Install requirements" 20 | # "gdown" is for downloading files from GoogleDrive 21 | pip3 install --user gdown > /dev/null 22 | 23 | echo "** Copy files for training" 24 | ln -sf $(readlink -f data/${CROWDHUMAN}) darknet/data/ 25 | cp data/${CROWDHUMAN}.data darknet/data/ 26 | cp data/crowdhuman.names darknet/data/ 27 | cp cfg/*.cfg darknet/cfg/ 28 | 29 | if [[ ! -f darknet/yolov4.conv.137 ]]; then 30 | pushd darknet > /dev/null 31 | echo "** Download pre-trained yolov4 weights" 32 | python3 -m gdown.cli https://drive.google.com/uc?id=1JKF-bdIklxOOVy-2Cr5qdvjgGpmGfcbp 33 | popd > /dev/null 34 | fi 35 | 36 | echo "** Done." 37 | --------------------------------------------------------------------------------