├── .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 | 
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 | 
133 |
134 | Another example for the training of "yolov4-tiny-crowdhuman-608x608" model on RTX 2080 Ti GPU (< 3 hours).
135 |
136 | 
137 |
138 | And another one for the training of "yolov4-tiny-3l-crowdhuman-416x416" model on RTX 2080 Ti GPU (< 2 hours).
139 |
140 | 
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 | 
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 | 
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 | [](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": "iVBORw0KGgoAAAANSUhEUgAAA1gAAAGoCAYAAABbkkSYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAsOUlEQVR4nO3dfbRlVX3m++/TlKD4QhVSIVjFSFVCtWmk0xHrAl7TaVvsokCvxR1DbbjeUBqS6tti58Xcq6C3Q6LSFxNvExkqBqUiGBskxDTVimI1onZ6BKTwhVeRI6BUXV6OFC9pjUbM7/6xZ+Gu4px6O7POOXvX9zPGHmetueZaa859du1Vz1lzz52qQpIkSZI0c/9orhsgSZIkSePCgCVJkiRJnRiwJEmSJKkTA5YkSZIkdWLAkiRJkqRODFiSJEmS1IkBS2qS3J7k5XPdjh6SvCPJR3ey/b4kr9zJ9i8m+Y190zpJ0p4YhetTkjcm+eu93PcNST6/r88jzZYFc90Aab6oqhfNdRt6qar/sLt1k/wBcFRV/e/7rkWSpL01TtenqVTVJ4BP9DhWki8Cf15V0/6RUdrXvIMlSZIkSZ0YsKRmeNhckj9I8hdJ/jzJ3ya5Nck/TnJOkoeT3J9k1dC+b0pyZ6t7T5J/s8Ox35bkgST/X5LfSFJJjmrbDkryviTfTfJQkg8nedY0bfxOkpe05Te047yorZ+Z5D8Ptf/Ph/b7tbbvI0neOVS+GngH8K+T/I8k3xg63c8l+e+tT59Pcljb55nteXkkyWNJbkpy+Eyee0nS9Ebh+jR0vPcleTTJvUlOHio/JMkl7VxbkrwnyQFt23bD/pKsSnJXkseTfCjJl3Yctj7VeZKcB/xz4APtmvaBDFzQnpsn2vN1zN7+LqTdYcCSpve/AB8HFgFfA65l8G9mCfAu4E+H6j4MvBp4HvAm4IIkx8JTIeatwCuBo4CX73Ce84F/DPxy274E+P1p2vSlof3/BXAP8KtD61/acYckRwMXAb8GvAB4PrAUoKo+B/wH4JNV9Zyq+mdDu/5vrS8/AxwI/J+tfC1wCHBkO9b/AfzdNO2VJPU3H69PAMcDdwGHAX8EXJIkbdvHgCfbcV4MrAKe9lnf9se8q4BzGFxj7gL+5905T1W9E/hvwFvaNe0t7Ty/2vpxCPB64JGd9EGaMQOWNL3/VlXXVtWTwF8Ai4Hzq+rHwBXAsiQLAarqM1X17Rr4EvB5Bn9Fg8Gb+Z9V1e1V9QPgD7adoF141gG/W1Vbq+pvGQSe06Zp05cYBCna8f+fofUpAxbwWuDTVfXlqvoR8O+Bf9iN/v9ZVX2rqv4OuJLBBRbgxwwuekdV1U+q6uaqemI3jidJ6mM+Xp8AvlNVH6mqnwCXAkcAh7dRDqcAv1NV36+qh4ELpjnWKcDtVfWp1r8LgQd35zzTtOnHwHOBXwRSVXdW1QM76YM0YwYsaXoPDS3/HfC99ma+bR3gOQBJTk5yQ5KtSR5jcIE4rNV5AXD/0LGGlxcDBwM3t+F2jwGfa+VT+RLwz5McARzAIPi8LMkyBn+Z+/oU+2x3/qr6Prv317vhC9oPaH1l8FfTa4Er2pCSP0ryjN04niSpj/l4fYKh60YLbNva8XPAM4AHho71pwxGSOxox2tWAZt38zxPU1VfAD4AfBB4OMnFSZ63kz5IM2bAkmYoyUHAXwLvAw6vqoXANcC2YREP0IbkNUcOLX+PwcXwRVW1sD0OqarpLhQTDMLOvwO+3O4cPcjgr4x/XVVT3Zl6YPicSQ5mcAfqqcPubl9bG35cVX9YVUczGLbxauCMPTmGJGnfm83r0y7cD/wIOGzoWM+bZnbE7drU7qQtnaLedJ52TauqC6vqJcDRDIYK/l971HppDxmwpJk7EDgImASebB+2XTW0/UrgTUn+SQs3/37bhhaIPsJgTPzPACRZkuSknZzvS8Bb+OlwwC/usL6jq4BXJ/mVJAcyGJ8//G//IQbDSXbr/SDJv0zyT9uHk59gMPxid4YcSpJm12xfn6bUhuR9Hvh/kzwvyT9K8gtJ/sUU1T8D/NMkpyZZAJwF/OwenO4h4Oe3rST5n5Ic30ZafB/4IV6ztI8ZsKQZauPSf4vBhepRBpNDbBja/lkGY8ivByaAG9qmH7Wfb99WnuQJ4L8CL9zJKb/EYDz5l6dZ37F9tzO4QP0nBn8ZfJTth1v8Rfv5SJKv7ry3wOBCdxWDcHVnO//Hd2M/SdIsmoPr086cwSDw3dHachWDz07t2ObvAa9jMHnFIwzuOm0aatOuvB94bZth8EIGk3t8pJ3zO+2Yf7yXfZB2SwZDWyXNliT/BLgNOKh9gFeSpDk3H69PbXTFZuANVXX9XLdH2h3ewZJmQZL/tX2fyCLgvcB/mS8XL0nS/ms+Xp+SnJRkYfsM2TsYfGbshl3sJs0bBixpdvwbBt9F8m3gJ8C/ndvmSJIEzM/r00sZtOd7DL7z69T2lSHSSHCIoCRJkiR14h0sSZIkSepkwVw3YG8ddthhtWzZsrluhiRpH7j55pu/V1U7+0LTec/rlCSNt+muVSMbsJYtW8amTZvmuhmSpH0gyXfmug0z5XVKksbbdNcqhwhKkiRJUicGLEmSJEnqxIAlSZIkSZ0YsCRJkiSpEwOWJEmSJHViwJIkSZKkTgxYkiRJktSJAUuSJEmSOjFgSZIkSVInBixJkiRJ6sSAJUmSJEmdGLAkSZIkqRMDliRJkiR1YsCSJEmSpE4MWJIkSZLUiQFLkjTykqxP8nCS26bY9ntJKslhbT1JLkwykeSWJMcO1V2b5O72WDtU/pIkt7Z9LkyS2emZJGnULJjrBsylZWd/Zq6bAMB9579qrpsgSaPuY8AHgMuGC5McCawCvjtUfDKwoj2OBy4Cjk9yKHAusBIo4OYkG6rq0VbnN4EbgWuA1cBn92F/gPlznQKvVZK0u7yDJUkaeVX1ZWDrFJsuAN7GIDBtswa4rAZuABYmOQI4CdhYVVtbqNoIrG7bnldVN1RVMQhxp+7D7kiSRpgBS5I0lpKsAbZU1Td22LQEuH9ofXMr21n55inKpzrnuiSbkmyanJycYQ8kSaPIgCVJGjtJDgbeAfz+bJ63qi6uqpVVtXLx4sWzeWpJ0jxhwJIkjaNfAJYD30hyH7AU+GqSnwW2AEcO1V3aynZWvnSKckmSnsaAJUkaO1V1a1X9TFUtq6plDIb1HVtVDwIbgDPabIInAI9X1QPAtcCqJIuSLGIwOca1bdsTSU5osweeAVw9Jx2TJM17BixJ0shLcjnwN8ALk2xOcuZOql8D3ANMAB8B3gxQVVuBdwM3tce7WhmtzkfbPt9mFmYQlCSNpv16mnZJ0nioqtN3sX3Z0HIBZ01Tbz2wforyTcAxM2ulJGl/4B0sSZIkSerEgCVJkiRJnRiwJEmSJKkTA5YkSZIkdWLAkiRJkqRODFiSJEmS1IkBS5IkSZI6MWBJkiRJUicGLEmSJEnqZJcBK8n6JA8nuW2Kbb+XpJIc1taT5MIkE0luSXLsUN21Se5uj7VD5S9Jcmvb58Ik6dU5SZIkSZpNu3MH62PA6h0LkxwJrAK+O1R8MrCiPdYBF7W6hwLnAscDxwHnJlnU9rkI+M2h/Z52LkmSJEkaBbsMWFX1ZWDrFJsuAN4G1FDZGuCyGrgBWJjkCOAkYGNVba2qR4GNwOq27XlVdUNVFXAZcOqMeiRJkiRJc2SvPoOVZA2wpaq+scOmJcD9Q+ubW9nOyjdPUT7dedcl2ZRk0+Tk5N40XZIkSZL2mT0OWEkOBt4B/H7/5uxcVV1cVSurauXixYtn+/SSJEmStFN7cwfrF4DlwDeS3AcsBb6a5GeBLcCRQ3WXtrKdlS+dolySJEmSRs4eB6yqurWqfqaqllXVMgbD+o6tqgeBDcAZbTbBE4DHq+oB4FpgVZJFbXKLVcC1bdsTSU5osweeAVzdqW+SJEmSNKt2Z5r2y4G/AV6YZHOSM3dS/RrgHmAC+AjwZoCq2gq8G7ipPd7Vymh1Ptr2+Tbw2b3riiRJkiTNrQW7qlBVp+9i+7Kh5QLOmqbeemD9FOWbgGN21Q5JkiRJmu/2ahZBSZIkSdLTGbAkSZIkqRMDliRJkiR1YsCSJEmSpE4MWJIkSZLUiQFLkiRJkjoxYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEmSJKkTA5YkSZIkdWLAkiRJkqRODFiSJEmS1IkBS5IkSZI6MWBJkiRJUicGLEmSJEnqxIAlSZIkSZ0YsCRJkiSpEwOWJEmSJHViwJIkSZKkTgxYkiRJktSJAUuSJEmSOjFgSZIkSVInBixJkiRJ6sSAJUkaeUnWJ3k4yW1DZX+c5JtJbknyV0kWDm07J8lEkruSnDRUvrqVTSQ5e6h8eZIbW/knkxw4a52TJI0UA5YkaRx8DFi9Q9lG4Jiq+iXgW8A5AEmOBk4DXtT2+VCSA5IcAHwQOBk4Gji91QV4L3BBVR0FPAqcuW+7I0kaVQYsSdLIq6ovA1t3KPt8VT3ZVm8AlrblNcAVVfWjqroXmACOa4+Jqrqnqv4euAJYkyTAK4Cr2v6XAqfuy/5IkkaXAUuStD/4deCzbXkJcP/Qts2tbLry5wOPDYW1beVPk2Rdkk1JNk1OTnZsviRpVBiwJEljLck7gSeBT+zrc1XVxVW1sqpWLl68eF+fTpI0Dy2Y6wZIkrSvJHkj8GrgxKqqVrwFOHKo2tJWxjTljwALkyxod7GG60uStB3vYEmSxlKS1cDbgNdU1Q+GNm0ATktyUJLlwArgK8BNwIo2Y+CBDCbC2NCC2fXAa9v+a4GrZ6sfkqTRYsCSJI28JJcDfwO8MMnmJGcCHwCeC2xM8vUkHwaoqtuBK4E7gM8BZ1XVT9rdqbcA1wJ3Ale2ugBvB96aZILBZ7IumcXuSZJGiEMEJUkjr6pOn6J42hBUVecB501Rfg1wzRTl9zCYZVCSpJ3yDpYkSZIkdWLAkiRJkqRODFiSJEmS1IkBS5IkSZI6MWBJkiRJUicGLEmSJEnqZJcBK8n6JA8nuW2o7I+TfDPJLUn+KsnCoW3nJJlIcleSk4bKV7eyiSRnD5UvT3JjK/9k+3JHSZIkSRo5u3MH62PA6h3KNgLHVNUvAd8CzgFIcjSDb75/UdvnQ0kOSHIA8EHgZOBo4PRWF+C9wAVVdRTwKHDmjHokSZIkSXNklwGrqr4MbN2h7PPtG+8BbgCWtuU1wBVV9aOquheYYPDFjMcBE1V1T1X9PXAFsCZJgFcAV7X9LwVOnVmXJEmSJGlu9PgM1q8Dn23LS4D7h7ZtbmXTlT8feGworG0rlyRJkqSRM6OAleSdwJPAJ/o0Z5fnW5dkU5JNk5OTs3FKSZIkSdptex2wkrwReDXwhqqqVrwFOHKo2tJWNl35I8DCJAt2KJ9SVV1cVSurauXixYv3tumSJEmStE/sVcBKshp4G/CaqvrB0KYNwGlJDkqyHFgBfAW4CVjRZgw8kMFEGBtaMLseeG3bfy1w9d51RZIkSZLm1u5M03458DfAC5NsTnIm8AHgucDGJF9P8mGAqroduBK4A/gccFZV/aR9xuotwLXAncCVrS7A24G3Jplg8JmsS7r2UJIkSZJmyYJdVaiq06conjYEVdV5wHlTlF8DXDNF+T0MZhmUJEmSpJHWYxZBSZIkSRIGLEmSJEnqxoAlSZIkSZ0YsCRJkiSpEwOWJEmSJHViwJIkSZKkTgxYkiRJktSJAUuSJEmSOjFgSZIkSVInBixJkiRJ6sSAJUmSJEmdGLAkSZIkqRMDliRJkiR1YsCSJEmSpE4MWJIkSZLUiQFLkiRJkjoxYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEmSJKkTA5YkSZIkdWLAkiRJkqRODFiSJEmS1IkBS5IkSZI6MWBJkiRJUicGLEmSJEnqxIAlSZIkSZ0YsCRJIy/J+iQPJ7ltqOzQJBuT3N1+LmrlSXJhkokktyQ5dmifta3+3UnWDpW/JMmtbZ8Lk2R2eyhJGhUGLEnSOPgYsHqHsrOB66pqBXBdWwc4GVjRHuuAi2AQyIBzgeOB44Bzt4WyVuc3h/bb8VySJAEGLEnSGKiqLwNbdyheA1zali8FTh0qv6wGbgAWJjkCOAnYWFVbq+pRYCOwum17XlXdUFUFXDZ0LEmStmPAkiSNq8Or6oG2/CBweFteAtw/VG9zK9tZ+eYpyp8mybokm5JsmpycnHkPJEkjx4AlSRp77c5TzcJ5Lq6qlVW1cvHixfv6dJKkeciAJUkaVw+14X20nw+38i3AkUP1lraynZUvnaJckqSnMWBJksbVBmDbTIBrgauHys9oswmeADzehhJeC6xKsqhNbrEKuLZteyLJCW32wDOGjiVJ0nYWzHUDJEmaqSSXAy8HDkuymcFsgOcDVyY5E/gO8PpW/RrgFGAC+AHwJoCq2prk3cBNrd67qmrbxBlvZjBT4bOAz7aHJElPY8CSJI28qjp9mk0nTlG3gLOmOc56YP0U5ZuAY2bSRknS/sEhgpIkSZLUiQFLkiRJkjoxYEmSJElSJwYsSZIkSepklwEryfokDye5bajs0CQbk9zdfi5q5UlyYZKJJLckOXZon7Wt/t1J1g6VvyTJrW2fC9sUuJIkSZI0cnbnDtbHgNU7lJ0NXFdVK4Dr2jrAycCK9lgHXASDQMZgytzjgeOAc7eFslbnN4f22/FckiRJkjQSdhmwqurLwNYditcAl7blS4FTh8ovq4EbgIVJjgBOAjZW1daqehTYCKxu255XVTe0aXMvGzqWJEmSJI2Uvf0M1uHtm+0BHgQOb8tLgPuH6m1uZTsr3zxF+ZSSrEuyKcmmycnJvWy6JEmSJO0bM57kot15qg5t2Z1zXVxVK6tq5eLFi2fjlJIkSZK02/Y2YD3UhvfRfj7cyrcARw7VW9rKdla+dIpySZIkSRo5exuwNgDbZgJcC1w9VH5Gm03wBODxNpTwWmBVkkVtcotVwLVt2xNJTmizB54xdCxJkiRJGikLdlUhyeXAy4HDkmxmMBvg+cCVSc4EvgO8vlW/BjgFmAB+ALwJoKq2Jnk3cFOr966q2jZxxpsZzFT4LOCz7SFJkiRJI2eXAauqTp9m04lT1C3grGmOsx5YP0X5JuCYXbVDkiRJkua7GU9yIUmSJEkaMGBJkiRJUicGLEmSJEnqxIAlSZIkSZ0YsCRJkiSpEwOWJEmSJHViwJIkSZKkTgxYkiRJktSJAUuSJEmSOjFgSZIkSVInBixJkiRJ6sSAJUmSJEmdGLAkSZIkqRMDliRJkiR1YsCSJEmSpE4MWJIkSZLUiQFLkiRJkjoxYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEmSJKkTA5YkSZIkdWLAkiRJkqRODFiSJEmS1IkBS5IkSZI6MWBJkiRJUicGLEmSJEnqxIAlSZIkSZ0YsCRJkiSpEwOWJGmsJfndJLcnuS3J5UmemWR5khuTTCT5ZJIDW92D2vpE275s6DjntPK7kpw0Zx2SJM1rBixJ0thKsgT4LWBlVR0DHACcBrwXuKCqjgIeBc5su5wJPNrKL2j1SHJ02+9FwGrgQ0kOmM2+SJJGgwFLkjTuFgDPSrIAOBh4AHgFcFXbfilwalte09Zp209MklZ+RVX9qKruBSaA42an+ZKkUWLAkiSNraraArwP+C6DYPU4cDPwWFU92aptBpa05SXA/W3fJ1v95w+XT7HPU5KsS7IpyabJycn+HZIkzXsGLEnS2EqyiMHdp+XAC4BnMxjit09U1cVVtbKqVi5evHhfnUaSNI8ZsCRJ4+yVwL1VNVlVPwY+BbwMWNiGDAIsBba05S3AkQBt+yHAI8PlU+wjSdJTDFiSpHH2XeCEJAe3z1KdCNwBXA+8ttVZC1zdlje0ddr2L1RVtfLT2iyDy4EVwFdmqQ+SpBGyYNdVJEkaTVV1Y5KrgK8CTwJfAy4GPgNckeQ9reyStsslwMeTTABbGcwcSFXdnuRKBuHsSeCsqvrJrHZGkjQSDFiSpLFWVecC5+5QfA9TzAJYVT8EXjfNcc4DzuveQEnSWHGIoCRJkiR1MqOAleR3k9ye5LYklyd5ZpLlSW5s33b/ySQHtroHtfWJtn3Z0HHOaeV3JTlphn2SJEmSpDmx1wEryRLgt4CVVXUMcACDservBS6oqqOAR4Ez2y5nAo+28gtaPZIc3fZ7EYOpcz+U5IC9bZckSZIkzZWZDhFcADyrTWV7MIMvcXwFcFXbfilwalte09Zp209sMzqtAa6oqh9V1b3ABFOMi5ckSZKk+W6vA1ZVbQHex2AK3AcYfNv9zcBjVfVkqzb8TfdLgPvbvk+2+s8fLp9iH0mSJEkaGTMZIriIwd2n5cALgGczGOK3zyRZl2RTkk2Tk5P78lSSJEmStMdmMkTwlcC9VTVZVT8GPgW8DFjYhgzC9t90vwU4EqBtPwR4ZLh8in22U1UXV9XKqlq5ePHiGTRdkiRJkvqbScD6LnBCkoPbZ6lOZPAFjNcDr2111gJXt+UNbZ22/QtVVa38tDbL4HJgBfCVGbRLkiRJkubEXn/RcFXdmOQq4KsMvtX+a8DFwGeAK5K8p5Vd0na5BPh4kglgK4OZA6mq25NcySCcPQmcVVU/2dt2SZIkSdJc2euABVBV5wLn7lB8D1PMAlhVPwReN81xzgPOm0lbJEmSJGmuzXSadkmSJElSY8CSJEmSpE4MWJIkSZLUiQFLkiRJkjoxYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEmSJKkTA5YkSZIkdWLAkiRJkqRODFiSJEmS1IkBS5IkSZI6MWBJkiRJUicGLEmSJEnqxIAlSZIkSZ0YsCRJkiSpEwOWJEmSJHViwJIkSZKkTgxYkiRJktSJAUuSJEmSOjFgSZIkSVInBixJkiRJ6sSAJUmSJEmdGLAkSZIkqRMDliRJkiR1YsCSJEmSpE4MWJIkSZLUiQFLkiRJkjoxYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEmSJKkTA5YkaawlWZjkqiTfTHJnkpcmOTTJxiR3t5+LWt0kuTDJRJJbkhw7dJy1rf7dSdbOXY8kSfOZAUuSNO7eD3yuqn4R+GfAncDZwHVVtQK4rq0DnAysaI91wEUASQ4FzgWOB44Dzt0WyiRJGmbAkiSNrSSHAL8KXAJQVX9fVY8Ba4BLW7VLgVPb8hrgshq4AViY5AjgJGBjVW2tqkeBjcDqWeuIJGlkGLAkSeNsOTAJ/FmSryX5aJJnA4dX1QOtzoPA4W15CXD/0P6bW9l05dtJsi7JpiSbJicnO3dFkjQKDFiSpHG2ADgWuKiqXgx8n58OBwSgqgqoHierqouramVVrVy8eHGPQ0qSRowBS5I0zjYDm6vqxrZ+FYPA9VAb+kf7+XDbvgU4cmj/pa1sunJJkrZjwJIkja2qehC4P8kLW9GJwB3ABmDbTIBrgavb8gbgjDab4AnA420o4bXAqiSL2uQWq1qZJEnbWTDXDZAkaR/7d8AnkhwI3AO8icEfGK9McibwHeD1re41wCnABPCDVpeq2prk3cBNrd67qmrr7HVBkjQqZhSwkiwEPgocw2D8+q8DdwGfBJYB9wGvr6pHk4TBVLmnMLhovbGqvtqOsxb4v9th31NVlyJJUgdV9XVg5RSbTpyibgFnTXOc9cD6ro2TJI2dmQ4R9LtFJEmSJKnZ64Dld4tIkiRJ0vZmcgdrVr9bBPx+EUmSJEnz20wC1qx+t0g7nt8vIkmSJGnemknA8rtFJEmSJGnIXgcsv1tEkiRJkrY30+/B8rtFJEmSJKmZUcDyu0UkSZIk6adm+j1YkiRJkqTGgCVJkiRJnRiwJEmSJKkTA5YkSZIkdWLAkiRJkqRODFiSJEmS1IkBS5IkSZI6MWBJkiRJUicGLEmSJEnqxIAlSZIkSZ0YsCRJkiSpEwOWJEmSJHViwJIkSZKkTgxYkiRJktSJAUuSJEmSOjFgSZIkSVInBixJkiRJ6sSAJUmSJEmdGLAkSZIkqRMDliRJkiR1YsCSJEmSpE4MWJIkSZLUiQFLkiRJkjoxYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEmSJKkTA5YkSZIkdWLAkiRJkqRODFiSJEmS1IkBS5IkSZI6MWBJkiRJUicGLEmSJEnqxIAlSZIkSZ0YsCRJYy/JAUm+luTTbX15khuTTCT5ZJIDW/lBbX2ibV82dIxzWvldSU6ao65IkuY5A5YkaX/w28CdQ+vvBS6oqqOAR4EzW/mZwKOt/IJWjyRHA6cBLwJWAx9KcsAstV2SNEIMWJKksZZkKfAq4KNtPcArgKtalUuBU9vymrZO235iq78GuKKqflRV9wITwHGz0gFJ0kgxYEmSxt2fAG8D/qGtPx94rKqebOubgSVteQlwP0Db/nir/1T5FPtIkvQUA5YkaWwleTXwcFXdPEvnW5dkU5JNk5OTs3FKSdI8Y8CSJI2zlwGvSXIfcAWDoYHvBxYmWdDqLAW2tOUtwJEAbfshwCPD5VPs85SquriqVlbVysWLF/fvjSRp3ptxwHJmJknSfFVV51TV0qpaxmCSii9U1RuA64HXtmprgavb8oa2Ttv+haqqVn5au5YtB1YAX5mlbkiSRkiPO1jOzCRJGjVvB96aZILBZ6wuaeWXAM9v5W8FzgaoqtuBK4E7gM8BZ1XVT2a91ZKkeW9GAcuZmSRJo6KqvlhVr27L91TVcVV1VFW9rqp+1Mp/2NaPatvvGdr/vKr6hap6YVV9dq76IUma32Z6B+tPmMWZmfzwsCRJkqT5bK8D1mzPzAR+eFiSJEnS/LZg11WmtW1mplOAZwLPY2hmpnaXaqqZmTbvzcxMkiRJkjTf7fUdLGdmkiRJkqTtzeQO1nTeDlyR5D3A19h+ZqaPt5mZtjIIZVTV7Um2zcz0JM7MJEmSJGlEdQlYVfVF4Itt+R6mmAWwqn4IvG6a/c8DzuvRFkmSJEmaKz2+B0uSJEmShAFLkiRJkroxYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEmSJKmTffE9WJIkacwsO/szc90EAO47/1Vz3QRJ2invYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEmSJKkTA5YkSZIkdWLAkiRJkqRODFiSJEmS1IkBS5IkSZI6MWBJkiRJUicGLEmSJEnqxIAlSZIkSZ0YsCRJkiSpEwOWJEmSJHViwJIkSZKkTgxYkiRJktSJAUuSJEmSOjFgSZIkSVInBixJkiRJ6mTBXDdAsOzsz8x1EwC47/xXzXUTJEmSpJHmHSxJkiRJ6sSAJUmSJEmdGLAkSZIkqRMDliRJkiR1YsCSJEmSpE4MWJIkSZLUiQFLkiRJkjoxYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEljK8mRSa5PckeS25P8dis/NMnGJHe3n4taeZJcmGQiyS1Jjh061tpW/+4ka+eqT5Kk+c2AJUkaZ08Cv1dVRwMnAGclORo4G7iuqlYA17V1gJOBFe2xDrgIBoEMOBc4HjgOOHdbKJMkaZgBS5I0tqrqgar6alv+W+BOYAmwBri0VbsUOLUtrwEuq4EbgIVJjgBOAjZW1daqehTYCKyevZ5IkkbFXgcsh11IkkZJkmXAi4EbgcOr6oG26UHg8La8BLh/aLfNrWy6ckmStjOTO1gOu5AkjYQkzwH+EvidqnpieFtVFVCdzrMuyaYkmyYnJ3scUpI0YvY6YDnsQpI0CpI8g0G4+kRVfaoVP9SuQbSfD7fyLcCRQ7svbWXTlW+nqi6uqpVVtXLx4sV9OyJJGgldPoM1W8Mu/MugJGlPJAlwCXBnVf3HoU0bgG1D0tcCVw+Vn9GGtZ8APN6uadcCq5IsaqMsVrUySZK2s2CmB9hx2MXgWjZQVZWky7CLdryLgYsBVq5c2e24kqSx9TLg14Bbk3y9lb0DOB+4MsmZwHeA17dt1wCnABPAD4A3AVTV1iTvBm5q9d5VVVtnpQeSpJEyo4C1s2EXVfXAHgy7ePkO5V+cSbskSQKoqr8GMs3mE6eoX8BZ0xxrPbC+X+skSeNoJrMIOuxCkiRJkobM5A6Wwy4kSZIkacheByyHXUiSJEnS9rrMIihJkiRJMmBJkiRJUjcGLEmSJEnqxIAlSZIkSZ0YsCRJkiSpEwOWJEmSJHViwJIkSZKkTgxYkiRJktSJAUuSJEmSOjFgSZIkSVInBixJkiRJ6sSAJUmSJEmdGLAkSZIkqRMDliRJkiR1YsCSJEmSpE4MWJIkSZLUiQFLkiRJkjoxYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEmSJKkTA5YkSZIkdbJgrhug+WPZ2Z+Z6yY85b7zXzXXTZAkSZL2mHewJEmSJKkT72BJkiTtIUd9SJqOAUuSJI2M+RRsJGkqDhGUJEmSpE4MWJIkSZLUiQFLkiRJkjrxM1ial+bLGHs/OCxJkqQ94R0sSZIkSerEO1iSJEkjzFEf0vziHSxJkiRJ6sSAJUmSJEmdOERQ2gmHXUiSJGlPeAdLkiRJkjoxYEmSJElSJwYsSZIkSerEgCVJkiRJnRiwJEmSJKmTeTOLYJLVwPuBA4CPVtX5c9wkSZK247VKmp4z70oD8yJgJTkA+CDwr4DNwE1JNlTVHXPbMml+mC8XLfDCpf2X1ypJ0u6YFwELOA6YqKp7AJJcAawBvGhJkuYLr1XSCJhPf5ScL/zj6OyaLwFrCXD/0Ppm4PgdKyVZB6xrq/8jyV1Dmw8DvrfPWjg6fB4GfB4Guj8PeW/Po80aXw+j9xz83Fw3YAq7vFbt5Do1as//VMahD2A/5pNx6AOMQD9289o97/uxm2azH1Neq+ZLwNotVXUxcPFU25JsqqqVs9ykecfnYcDnYcDnYcDnwedgtkx3nRqH538c+gD2Yz4Zhz6A/Zhv5kM/5sssgluAI4fWl7YySZLmC69VkqRdmi8B6yZgRZLlSQ4ETgM2zHGbJEka5rVKkrRL82KIYFU9meQtwLUMpr5dX1W37+Fhphw6uB/yeRjweRjweRjwefA5mLEZXqvG4fkfhz6A/ZhPxqEPYD/mmznvR6pqrtsgSZIkSWNhvgwRlCRJkqSRZ8CSJEmSpE5GPmAlWZ3kriQTSc6e6/b0luTIJNcnuSPJ7Ul+u5UfmmRjkrvbz0WtPEkubM/HLUmOHTrW2lb/7iRr56pPM5HkgCRfS/Lptr48yY2tv59sHzwnyUFtfaJtXzZ0jHNa+V1JTpqjruy1JAuTXJXkm0nuTPLS/fH1kOR327+J25JcnuSZ+8PrIcn6JA8nuW2orNvvP8lLktza9rkwSWa3h+Nlvl+j9vXraZb6MBbXyfYe9pUk32j9+MNWPnLvaxmDa3WS+9p74deTbGplI/Waaucf+f8zJHlh+z1sezyR5HfmdT+qamQfDD5k/G3g54EDgW8AR891uzr38Qjg2Lb8XOBbwNHAHwFnt/Kzgfe25VOAzwIBTgBubOWHAve0n4va8qK57t9ePB9vBf4T8Om2fiVwWlv+MPBv2/KbgQ+35dOAT7blo9vr5CBgeXv9HDDX/drD5+BS4Dfa8oHAwv3t9cDgC1/vBZ419Dp44/7wegB+FTgWuG2orNvvH/hKq5u278lz3edRfTAC16h9/XqapT6MxXWytec5bfkZwI2tfSP3vsYYXKuB+4DDdigbqddUa8NY/Z+Bwfvqgwy+4Hfe9mPWn5jOT/JLgWuH1s8Bzpnrdu3jPl8N/CvgLuCIVnYEcFdb/lPg9KH6d7XtpwN/OlS+Xb1ReDD4zpnrgFcAn27/cL4HLNjx9cBglq+XtuUFrV52fI0M1xuFB3AIg2CRHcr3q9cDg4B1f3uTXNBeDyftL68HYBnb/4e4y++/bfvmUPl29Xzs8e9pJK5R++r1NIf9GfnrJHAw8FXg+FF7X2NMrtVMHbBG6jXFGP6fAVgF/Pf53o9RHyK47T9Z22xuZWOp3Tp/MYO/ah1eVQ+0TQ8Ch7fl6Z6TcXiu/gR4G/APbf35wGNV9WRbH+7TU/1t2x9v9Uf9eVgOTAJ/1oZffDTJs9nPXg9VtQV4H/Bd4AEGv9+b2f9eD9v0+v0vacs7lmvvjOrra2TfT0b9OtmG1n0deBjYyODOzai9r/0J43GtLuDzSW5Osq6Vjdprahz/z3AacHlbnrf9GPWAtd9I8hzgL4HfqaonhrfVIIbXnDRsliR5NfBwVd08122ZYwsYDOe5qKpeDHyfwW3xp+wnr4dFwBoGF48XAM8GVs9po+aJ/eH3r9kzSq+ncbhOVtVPquqXGdwFOg74xblt0Z4Zs2v1r1TVscDJwFlJfnV444i8psbq/wzts3uvAf5ix23zrR+jHrC2AEcOrS9tZWMlyTMYXDQ+UVWfasUPJTmibT+CwV+7YPrnZNSfq5cBr0lyH3AFg6EH7wcWJtn2hdnDfXqqv237IcAjjP7zsBnYXFU3tvWrGLx57m+vh1cC91bVZFX9GPgUg9fI/vZ62KbX739LW96xXHtnVF9fI/d+Mm7Xyap6DLiewXC6UXpfG5trdRspQVU9DPwVg8A7aq+pcfs/w8nAV6vqobY+b/sx6gHrJmBFm53mQAa3DTfMcZu6ShLgEuDOqvqPQ5s2AGvb8loGY863lZ/RZlA5AXi83T69FliVZFH76/+qVjYSquqcqlpaVcsY/J6/UFVvYHABem2rtuPzsO35eW2rX638tAxmLloOrGDwof6RUFUPAvcneWErOhG4g/3s9cBgaOAJSQ5u/0a2PQ/71ethSJfff9v2RJIT2vN6xtCxtOdG9Ro1Uu8n43KdTLI4ycK2/CwGnyO7kxF6XxuXa3WSZyd57rZlBq+F2xix19QY/p/hdH46PBDmcz/2xQe7ZvPBYKaQbzEYp/zOuW7PPujfrzC45XkL8PX2OIXBGOXrgLuB/woc2uoH+GB7Pm4FVg4d69eBifZ401z3bQbPycv56cxEP8/gTXeCwS3jg1r5M9v6RNv+80P7v7M9P3cxgjOkAb8MbGqvif/MYCac/e71APwh8E0GF72PM5htauxfDwwuLg8AP2bw18kze/7+gZXtOf028AF2+HC0jz3+fc3ra9S+fj3NUh/G4joJ/BLwtdaP24Dfb+Uj+b7GCF+rW3u/0R63b/u3O2qvqXb+X2YM/s/A4KMAjwCHDJXN236knUySJEmSNEOjPkRQkiRJkuYNA5YkSZIkdWLAkiRJkqRODFiSJEmS1IkBS5IkSZI6MWBJkiRJUicGLEmSJEnq5P8HgMszitD0e64AAAAASUVORK5CYII=\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": "iVBORw0KGgoAAAANSUhEUgAAAmoAAAJcCAYAAABJ8YjPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAB0GklEQVR4nO39cZxcdZnnfX+vrlRCJQqdOIFHmgSYyIZbXpFEsibe2dlHcCUKI/SCGFmYYb0d3X1ud3cANzvJmFuComQ2O8LOfd/jrMw46wyIQWBamDBG1qDuZEnGxE5oM5IBBBILlIyhQUkTOp3f80ed0zldfc6pc6pOVZ2q+rxfr7y661TVqVOnuvtc+f1+13WZc04AAADIn752HwAAAADCEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRqAxMxsv5m9p93HkQUz+30z+9OY+58zs38Rc/93zex3MjiOuvdjZn9jZjc0+3UAtM+Mdh8AgM7hnLug3ceQFefcF5I+1sw2Snqbc+76LF7bzGZKekHSOY3sxzn3gYyO5xxJz0oqOueOZ7FPANlgRA0AWu+fS9rrnPtVuw8EQL4RqAFILDgdaGYbzewbZna3mf3SzEbM7J+Y2Xoze8nMDpnZpYHnftTMfuw99idm9m+q9v2fzOxFM3vBzH7HzJyZvc27b5aZ/RczO2hmPzezPzGzUsQxPm9mF3nfX+ft5wLv9sfMbChw/HcHnvdb3nN/YWafDmx/v6Tfl7TGzH5lZvsCL3e2me3w3tO3zezXvOec4p2XX5jZqJn9wMzOCDzvMkmP1NqPt6+VZva/vP3sC049B6czzaxgZn9oZv9oZs+a2b/z3vuMBK/zfe/rqPce321mbzOz75nZK94+t4SdbwDNRaAGoBEflPSXkuZKGpa0TZW/KwOSPivpvwUe+5Kk35R0qqSPSrrDzN4pTQZDN0v6F5LeJuk9Va+zSdI/kbTUu39A0mcijul7gef/fyX9RJURLP/296qfYGZvl/QlSb8l6UxJb5F0liQ5574l6QuStjjn3uScuzDw1H/lvZfTJc2U9B+97TdIOk3SAm9f/1bSWOB5l0naWms/ZjbgPe42SfO87Q+Y2fyQ9/1xSR9Q5Ry9U9JgyGOijtc/P/3ee3xc0uckfVuVz/YsSf93yP4ANBmBGoBG/E/n3DZvXdM3JM2XtMk5Ny7p65LOMbN+SXLObXXOPeMqvqdKEPAb3n4+LOnPnXP7nXNHJW30X8DMTNInJN3knDvinPulKoHTRyKO6XuqBGTy9n974HZooCbpQ5L+2jn3fefcMUn/l6QTCd7/nzvn/sE5NybpPlWCJEkaVyVAe5tzbsI5t8c596r3fhZJmuGcO5BgP9dLesQ594hz7oRz7lFJu1UJ9Kp9WNJ/dc791Dn3sirBbdLjDTMu6WxJZzrnXnfO/W2NcwGgCQjUADTi54HvxyT9o3NuInBbkt4kSWb2ATPbaWZHzGxUlWDDn3o7U9KhwL6C38+XNFvSHm/6b1TSt7ztYb4n6TfM7K2SCqoEJKu8BfOnSdob8pwpr++ce03SLyL2H/SzwPdH5b1XVUYZt0n6ujeV+5/NrOjdd5mkv0m4n7MlXeO/b++9/zNJb631Hqq+r/U6Yf6TJJP0d1bJ9v0/Yh4LoEkI1AA0nZnNkvSApP8i6QznXL8qa7TMe8iL8qYaPQsC3/+jKkHfBc65fu/fac650CDDOfe0KkHIv5f0fW8k62eqjMr9rXMubKTsxeBrmtlsVUbEJneb9L16xzDunLvVOfd2Sf+7KlO+v+3dXb0+Lc4hSX8ZeN/9zrk5zrmw0bK4c1jzkKdtcO5nzrmPO+fOlPRvJP2xv2YQQOsQqAFohZmSZkk6LOm4mX1A0qWB+++T9FEz+9+8IOn/8u/wAqu7VFnTdrpUWbtlZqtjXu97kv6dTk5zfrfqdrX7Jf2mmf0zr3TGZzX17+PPVZnGTfQ308wuNrMlZlaQ9Koq04gnvPf2LkmPJdmPpLslfdDMVnvJAqeY2XvM7KyQx94n6Xe9c9Mv6fcSvoZU+VxOSPr1wHu4JvA6L6sSzCWZDgaQIQI1AE3nrSv7D6oEEy+rsqj9ocD9fyPpj1QJYJ6WtNO765j39ff87Wb2qqT/IWlxzEt+T9KbdTKbsfp29fHtl/RJSV9TZWTqZUk/DTzkG97XX5jZD+PfrSTp/6NK8PeqpB97r/+Xki6R9Lhz7vUE+5Bz7pCkK1XJOj2sygjbWoX/7b5LlXV/T6iS2PGIpOOSJkIeW/06RyV9XtIOb4p1paR/KmmXmf1Klc/qd51zP0ly3ACyY86lGtEHgKYzs/9N0o8kzeqmAqxm9seSfuSc++MWvNYHJP2Jc+7sZr8WgOZhRA1ALpjZv/Tqpc2V9AeSHu6mIM2zV9JfNWPHZlYys8vMbIZX1uOWZr0WgNZhRA1ALpjZtyS9W5Wpuu9J+j+dcy+296g6h7f+7XuSzlcl+WKrKtOVr7b1wAA0hEANAAAgp5j6BAAAyKkZtR/SeX7t137NnXPOOe0+DAAAgJr27Nnzj8650CLeXRmonXPOOdq9e3e7DwMAAKAmM3s+6j6mPgEAAHKKQA0AACCnCNQAAAByikANAAAgpwjUAAAAcopADQAAIKcI1AAAAHKKQA0AACCnCNQAAAByikANAAAgpwjUAAAAcopADQAAIKcI1AAAAHKKQA0AACCnCNQAAAByikANAAAgpwjUAAAAcopADQAAIKcI1AAAAHKKQA0AACCnZrT7AAAAAPJmaLiszdsO6IXRMZ3ZX9La1Ys1uGyg5cdBoAYAABAwNFzW+gdHNDY+IUkqj45p/YMjktTyYI2pTwAAgIDN2w5MBmm+sfEJbd52oOXHQqAGAAAQ8MLoWKrtzUSgBgAAEHBmfynV9mYiUAMAAAhYu3qxSsXClG2lYkFrVy9u+bGQTAAAABDgJwyQ9QkAAJBDg8sG2hKYVWPqEwAAIKcI1AAAAHKKQA0AACCnCNQAAAByikANAAAgpwjUAAAAcqppgZqZLTazvYF/r5rZjWY2z8weNbOnvK9zvcebmf2RmT1tZk+Y2TsD+7rBe/xTZnZDs44ZAAAgT5oWqDnnDjjnljrnlkq6SNJRSX8laZ2k7zjnzpP0He+2JH1A0nnev09I+pIkmdk8SbdIWiHpXZJu8YM7AACAbtaqqc/3SnrGOfe8pCslfdXb/lVJg973V0r6C1exU1K/mb1V0mpJjzrnjjjnXpb0qKT3t+i4AQAA2qZVgdpHJN3rfX+Gc+5F7/ufSTrD+35A0qHAc37qbYvaPoWZfcLMdpvZ7sOHD2d57AAAAG3R9EDNzGZKukLSN6rvc845SS6L13HOfdk5t9w5t3z+/PlZ7BIAAKCtWjGi9gFJP3TO/dy7/XNvSlPe15e87WVJCwLPO8vbFrUdAACgq7UiULtWJ6c9JekhSX7m5g2SvhnY/tte9udKSa94U6TbJF1qZnO9JIJLvW0AAABdbUYzd25mcyS9T9K/CWzeJOk+M/uYpOclfdjb/oikyyQ9rUqG6EclyTl3xMw+J+kH3uM+65w70szjBgAAyAOrLBPrLsuXL3e7d+9u92EAAADUZGZ7nHPLw+6jMwEAAEBOEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRoAAEBOEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRoAAEBOEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRoAAEBOEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRoAAEBOEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRoAAEBOEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRoAAEBOEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRoAAEBOEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRoAAEBOEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRoAAEBOEagBAADkFIEaAABAThGoAQAA5BSBGgAAQE4RqAEAAOQUgRoAAEBOEagBAADkFIEaAABATjU1UDOzfjO738yeNLMfm9m7zWyemT1qZk95X+d6jzUz+yMze9rMnjCzdwb2c4P3+KfM7IZmHjPQzTYMjWjR+kd0zrqtWrT+EW0YGmn3IQEAYjR7RO2/SvqWc+58SRdK+rGkdZK+45w7T9J3vNuS9AFJ53n/PiHpS5JkZvMk3SJphaR3SbrFD+4AJLdhaER37zyoCeckSRPO6e6dBwnWACDHmhaomdlpkv65pD+TJOfcG865UUlXSvqq97CvShr0vr9S0l+4ip2S+s3srZJWS3rUOXfEOfeypEclvb9Zxw10q3t3HUq1HQDQfs0cUTtX0mFJf25mw2b2p2Y2R9IZzrkXvcf8TNIZ3vcDkoJXjJ9626K2T2FmnzCz3Wa2+/Dhwxm/FaDz+SNpSbcDANqvmYHaDEnvlPQl59wySa/p5DSnJMk55yRlcpVwzn3ZObfcObd8/vz5WewS6BpDw+XI+wpmLTwSAEAazQzUfirpp865Xd7t+1UJ3H7uTWnK+/qSd39Z0oLA88/ytkVtB5DQ5m0HIu+7dsWCyPsAAO3VtEDNOfczSYfMbLG36b2S/l7SQ5L8zM0bJH3T+/4hSb/tZX+ulPSKN0W6TdKlZjbXSyK41NsGIKEXRsci77ttcEkLjwQAkMaMJu//30u6x8xmSvqJpI+qEhzeZ2Yfk/S8pA97j31E0mWSnpZ01HusnHNHzOxzkn7gPe6zzrkjTT5uoKuc2V9SOSRYG+gvteFoAABJNTVQc87tlbQ85K73hjzWSfpkxH6+IukrmR4c0EPWrl6s9Q+OaGx8YnJbqVjQ2tWLY54FAGi3Zo+oAciBwWWVROnN2w7ohdExndlf0trViye3AwDyiUAN6BGDywYIzACgw9DrEwAAIKcI1AAAAHKKQA0AACCnCNQAAAByikANAAAgpwjUAAAAcopADQAAIKcI1AAAAHKKQA0AACCnCNQAAAByikANAAAgpwjUAAAAcopADQAAIKcI1AAAAHKKQA0AACCnCNQAAAByikANAAAgpwjUAAAAcopADQAAIKcI1AAAAHKKQA0AACCnCNQAAAByikANAAAgpwjUAAAAcopADQAAIKcI1AAAAHKKQA0AACCnZrT7AAAks2FoRPfuOqQJ51Qw07UrFui2wSXtPiwAQBMRqAEdYMPQiO7eeXDy9oRzk7cJ1gCgezH1CXSAe3cdSrUdANAdCNSADjDhXKrtAIDuQKAGdICCWartAIDuQKAGdIBrVyxItR0A0B1IJgA6gJ8wQNYnAPQWc124xmX58uVu9+7d7T4MAACAmsxsj3Nuedh9TH0CAADkFFOfAICeMzRc1uZtB/TC6JjO7C9p7erFGlw20O7DAqYhUAN6CBcnoPJ7sP7BEY2NT0iSyqNjWv/giCTx+4DcIVADEur0IIeLE1CxeduByd8D39j4hDZvO8DvAnKHNWpAAn6QUx4dk9PJIGdouNzuQ0ss7uIE9JIXRsdSbQfaiUANSKAbghwuTkDFmf2lVNuBdiJQAxLohiCHixNQsXb1YpWKhSnbSsWC1q5e3KYjAqIRqAEJdEOQw8UJvWpouKxVm7br3HVbtWrTdknS7Vct0UB/SSZpoL+k269awvo05BLJBEACa1cvnrIQX+q8IMe/CHVyQgSQVlQSze1XLdGOdZe0+eiA2gjUgAS6JcgZXDbQcccMNIIMT3Q6AjUgIYIcoPN0w/pS9DbWqAEAulY3rC9Fb2NEDciB8z/9iF6fcJO3TymYnvz8ZQ3ts9ML9AJZ6Ib1pehtjKgBbVYdpEnS6xNO53/6kbr32Q0FeoEsDC4bIMMTHY0RNaDNqoO0WtuTYAE1cBLrS9HJGFEDulCZBdQA0BUI1IAus2FoJPI+FlADQGdh6hNos1MKFjrNeUrB6trfvbsORd7HAmokQSIKkB+MqAFt9uTnL5sWlDWS9Tnhote2cbFFLSSiAPnCiBqQA42W4ggqmIUGawWrb4QOvYVEFCBfGFEDusy1Kxak2g4EUckfyBcCNaDL3Da4RNevXDg5glYw0/UrF+q2wSVtPjJ0Air5A/nC1CfQhW4bXEJghrpQyR/IFwI1AMAkfx0aWZ9APhCoAQCmoJI/kB9NXaNmZs+Z2YiZ7TWz3d62eWb2qJk95X2d6203M/sjM3vazJ4ws3cG9nOD9/inzOyGZh4zAABAXrQimeBi59xS59xy7/Y6Sd9xzp0n6TvebUn6gKTzvH+fkPQlqRLYSbpF0gpJ75J0ix/cAQAAdLN2ZH1eKemr3vdflTQY2P4XrmKnpH4ze6uk1ZIedc4dcc69LOlRSe9v8TEDAAC0XLPXqDlJ3zYzJ+m/Oee+LOkM59yL3v0/k3SG9/2ApGDvm59626K2T2Fmn1BlJE4LFy7M8j0AmYhry0PLHgBAmGYHav/MOVc2s9MlPWpmTwbvdM45L4hrmBcEflmSli9fnsk+gaz4bXn8kgd+Wx5f1H0EawDQ25o69emcK3tfX5L0V6qsMfu5N6Up7+tL3sPLkoKl08/ytkVtBzrGrQ/vj2zLE9eyBwDQ25oWqJnZHDN7s/+9pEsl/UjSQ5L8zM0bJH3T+/4hSb/tZX+ulPSKN0W6TdKlZjbXSyK41NsG5N51dz2uc9Zt1ctHx0Pvf2F0jJY9AIBIzZz6PEPSX1mljc0MSV9zzn3LzH4g6T4z+5ik5yV92Hv8I5Iuk/S0pKOSPipJzrkjZvY5ST/wHvdZ59yRJh43kInr7npcO56J/1H12/KUQ4IyWvYAAJoWqDnnfiLpwpDtv5D03pDtTtInI/b1FUlfyfoYgWaqFaRJmmzLQ8seAEAYOhMAbdJfKk5JFiDrEwBQjUANaJONV1ww+T0tewAAYdpR8BboCasWzYu9j8AMAFALgRrQJPd8/N2hwdr1Kxfqno+/uw1HBADoNEx9Ak1EQAYAaAQjagAAADnFiBqAXNgwNKJ7dx3ShHMqmOnaFQt02+CSdh8WALQVgRqAttswNKK7dx6cvD3h3ORtgjUAvYypTwBtd++uQ6m2A0CvYEQNyNDQcJnCtXWYcC7VdgDoFQRqQEaGhstTWkGVR8e0/sERSSJYq6FgFhqUFSq9ggGgZzH1CWRk87YDU/p1StLY+IQ2bzvQpiPqHNeuWJBqOwD0CkbUgIy8MDqWajtO8hMGyPoEgKkI1ICMnNlfUjkkKDuzv9SGo+k8tw0uITADgCpMfQIZWbt6sUrFwpRtpWJBa1cvbtMRAQA6HSNqQEb8hAGyPgEAWSFQAzI0uGyAwAwAkBmmPgEAAHKKETWgx1GkFwDyi0AN6GEU6QWAfCNQA+qU5UjU29Zv1fFAYf4ZJj19++UZHWm0uCK9BGoA0H6sUQPq4I9ElUfH5HRyJGpouJx6X9VBmiQdd5XtzUaRXgDINwI1oA5ZtouqDtJqbc9SVDFeivQCQD4QqAF16JaRKIr0dr+h4bJWbdquc9dt1apN2+sa9QXQPqxRA+rQLe2iKNLb3UgWATofgRpQh7WrF0+5AEr1j0TNsPBpzhnWyBEmR5He7kWyCND5mPoE6jC4bEC3X7VEA/0lmaSB/pJuv2pJXRe/p2+/fFpQ1qqsT3S3bpmiB3oZI2pAnbIciSIoQzN0yxQ90MsYUQOALkWyCND5GFEDEqLVEjpNkmQRfq6BfCNQAxIgew6dKm6Knp9rIP+Y+gQSyLLALZAX/FwD+UegBiRA9hy6ET/XQP4x9QkkkEX2HGuBkDdkhQL5x4gakECj2XNZNnEHskJWKJB/BGpAAo0WuGUtEPIoy8LNAJqDqU8goUYK3LIWCHlFCzEg3xhRA1ogas0Pa4EAAHEI1IAWYC0QAKAeTH0CLZCkQjwAANUI1IAQWZTSuO6ux7XjmSOTt1ctmqcd6y7J+lABAF2MqU+gShalNKqDNEna8cwRXXfX4xkfLQCgmxGoAVWyKKVRHaTV2g4AQBgCNaBKo6U0KGILAMgKgRoQsGFoRC7ivqSlNChiCwDICoEa4NkwNKK7dx4MvS9NKY24kbdVi+bVdWwAgN5EoAZ47t11KPK+NG11okbeZs3o0z0ff3ddxwYA6E0EaoBnwkVNeipVaY6o4rZ/cPU76j42AEBvoo4a4CmYhQZrBbNU+6G4LQAgKwRqgOfaFQtC16hdu2JB6n3R6BoAkAUCNcBz2+ASSZW1ahPOqWCma1csmNwOAECrmYtZl9Opli9f7nbv3t3uwwByL4tWWQCAxpjZHufc8rD7GFEDepTfKsvvwuC3ypLSJU+geQikAZD1CfSoLFploXmy6DkLoPMxooaOwMhC9hptlYXmiguk+dkHegcjasg9RhaaI6owb9JWWWguAmkAEoEaOgBTdM0RVZg3aassNBeBNACJQA0dgJGF5hhcNqDbr1qigf6STNJAfylVqyw0F4E0AIk1augAZ/aXVA4JyhhZaByFefOLDhcAJAI1dIC1qxdPKSMhNTayQGICOgWBNAACNeRePSMLUcHY0HBZa+/fp/GJSqHn8uiY1t6/b8rr1EKgBwBoFToToOtUF3KVKiNwt1+1RLc+vF8vHx2f9py5s4sa/sylifZ945a907bfuWYpwVoXIAgH0A50JkBPicsSDQvSJEVurxYWpPnbuaC3VtZBVRajrWlsGBqhryyAmpqe9WlmBTMbNrO/9m6fa2a7zOxpM9tiZjO97bO82097958T2Md6b/sBM1vd7GNGZ4vKBg1LSOgWQ8Nlrdq0Xeeu26pVm7Z3fY25ZtTWu/Xh/ZNBmm98wunWh/c3eLRTbRga0TnrturunQc14c1oTDinu3ce1IahkUxfC0Dna0V5jt+V9OPA7T+QdIdz7m2SXpb0MW/7xyS97G2/w3uczOztkj4i6QJJ75f0x2Y2NWcdCIjKBrWY5/SXipH3+UHQOeu2NnhkzdGLBYGbUVuv0dHWJDYMjejunQcj74+7D0BvamqgZmZnSbpc0p96t03SJZLu9x7yVUmD3vdXerfl3f9e7/FXSvq6c+6Yc+5ZSU9LelczjxudLaz+lEmKWo1Z7DNtvOKC0PuCQVBe9WJB4E6trXfvrkPtPgQAHabZI2p3SvpPkk54t98iadQ5d9y7/VNJ/uKPAUmHJMm7/xXv8ZPbQ54zycw+YWa7zWz34cOHM34b6CRhhVzjUmY2X3Nh5BqksCAoTNxoXbN1atDSiGZU7Y8aVY0bbU1jaLg8OdUJAEk1LVAzs9+U9JJzbk+zXiPIOfdl59xy59zy+fPnt+IlkWODywa0Y90lenbT5dqx7hINRFzAB/pLsQvFkwY7z266vK7jzEIvthpqRtX+jVdcoGLf1JA7brQ1DX9kFgDSauaI2ipJV5jZc5K+rsqU53+V1G9mfrbpWZL8hTRlSQskybv/NEm/CG4PeQ6QSL0X9iTBzqpF8xo6tkb1YquhZrS/Glw2oM3XXDhln3GjrWkkHZk9pdDOsVkAedSSOmpm9h5J/9E595tm9g1JDzjnvm5mfyLpCefcH5vZJyUtcc79WzP7iKSrnHMfNrMLJH1NlXVpZ0r6jqTznHORf/Woo4Yw9ZRzCKvJFrRq0Tzd8/F3N+NwU6H+V76du25r7PS7JM0w6enb2zcyC6B98lZH7fckfd3MbpM0LOnPvO1/JukvzexpSUdUyfSUc26/md0n6e8lHZf0ybggDZCiA5e0wUun9Fuk1VC+RfWrDSrOKGhouMznCGCKRCNqZvaXzrnfqrUtLxhR621xnQm4CPaGvBWTrTUy6xvoL2nHuksyf+28/0cD6HVZjKhNWU3r1TG7qNEDA5ohqlzFp+5rXpV55Ed1rTK/mKyktgVr1SOzUf89zjpTtzpA9GvsBY8J6RH8opVikwm8jgC/lPQOM3vV+/dLSS9J+mZLjhBIKepiN+Fc1xeC7XXX3fV4ZNHYdtcwC2YiR2UhZ52p24s19pqtFwtMo71iAzXn3O3OuTdL2uycO9X792bn3Fucc+tbdIxAKnEXOy5S3eu6ux7XjmeORN6fpxpmrcrU7cUae81G8ItWSzT16Zxbb2YDks4OPsc59/1mHRh6T1bTCWtXL45dD8RFqjvFBWmSVLDmlb4Iay/2XExtvVYlqUQlMXRzjb1mI/hFqyUK1MxskypZmH8vyb/6OUkEashElmtp/Md/6r59oaMoXKR607UrFtR+UB2iesCes25rzWCt2euawv7T0u019pqN4BetlrTg7b+UtNg5d5lz7oPevyuaeWDoLVlOJ/gjcxPOTWvtxEWqN12/cmFTEgnyvi6pGYWBe10vFphGeyXN+vyJpKKkY008FvSwrKYTqkfmnE42ZB8gO6urrVo0L3T6c9WieU0L0jqhLRQ19rLVKbUV0T1iAzUz+79VucYdlbTXzL6jQLDmnPsPzT089IqsphPCRub8IC3r+lRor7A1jdLUtWrN7ByRtC1U3lFqIj2CX7RSrRE1v2rsHkkPNflY0MOyWksTNQJXHh3Tqk3buRjlSCMBQtSaxtuvWtKyll7dsHicOmtA/sUGas65r7bqQNDbsppOiBqZM2lyOxej9ms0QIhb09iszzQqaSBKXCJBXrTjPAJIJ2nW54g0rZj2K6qMuN3mnPtF1geG3pPFdELYyJy/Ri2oGy9GnTSF1WiA0OoSCUmDtE5rVUapCSD/kiYT/I0qZTm+5t3+iKTZkn4m6b9L+mDmRwbUIWxkLqoZdjddjDplCssPJhv9TFpZIqFWZudAf6kjguMwlJoA8i9poPYvnHPvDNweMbMfOufeaWbXN+PAgHpVj8yt2rS96y9G7ZzCSjqSl6QxedLPpJX1wW7asjf2/k5OUqHOGpB/SeuoFczsXf4NM/unkvxCMsczPyogQ71Q96hdU1hp+h7WypJM85m0oj7Y0HBZ567bGtlAvRtQZw3Iv6Qjar8j6Stm9iZVlvy8Kul3zGyOpNubdXBAFnqh7lG7prDSjOTFBY311LjLskRC9ajg7Jl9euql1zLZd95RagLIt6S9Pn8gaYmZnebdfiVw933NODAgS91+MWrXFFaakbyoYDKuxl0rEiTC1vcl1QmZnQA6W62Ct9c75+42s5urtkuSnHNfbOKxAaGyuni/45Zv6dVjJwObU2cV9MSt72/66zZDK0cNg+ehzyxxP9U0weTQcFkbH9qv0bHxyW3NSpCot3DtnWuWZnYMABCl1ojaHO/rm5t9IEASWWU3VgdpkvTqsQm945ZvhQZrnZBV2YpRw+rzEBakRQVfSYPJuKSDZiRI1LOO74w3z8zN5w6gu9UqePvfvK+3tuZwgHhZZTdWB2m1tlMYtCJq9KlgphPO1RzJSxJM1hrhyjpBIq6ES5T1l70902MAgCiJsj7N7J+Y2XfM7Efe7XeY2YbmHhowXbuyGykMWhH1fk84p2c3Xa4d6y5pOHCtdU6zTpCoZx3f5m0HMj0GAIiStDzHXZLWSxqXJOfcE6oUvQVaKuoi3ezsxma+7tBwWas2bde567Zq1abtNQustlMrzn/cvuISJOo5j0PDZf3+g0+kPsby6FiuPycA3SNpoDbbOfd3Vduon4aWS1sTLerifeqsQujjo7Y3qxZbmjpkedCKmnRhryFJc2cXI2t81XMeh4bLWnv/Ph0dP1HXceb5cwLQPZIGav9oZovktUw0sw9JerFpRwVEGFw2oKsvGlDByzwumOnqi8LXPcVdvJ+49f3TgrK4rM9mFQaNW/uWR42ehySjXmGvceeapRr+zKWRr1PPebz14f0an6i/nG2ePycA3SNpwdtPSvqypPPNrCzpWUnXNe2ogAhDw2U9sKc8mW044Zwe2FPW8rPnTbuI10oAiCvFEaYZWZWduPat3vOQJnM27WukPY9Dw2W9fHQ89L408vw5AegOSQO1sqQ/l/SYpHmqdCa4QdJnm3RcQKgsKuHn6eLaS02xm5k5m+Q81moIX63YJx0/UdnHa8eOT6npFrZ/AGiGpFOf35T0QVWSCV6Q9CtJvdFfBbmSthJ+mDxdXHuhD6mvGYGzP5VaHh2TVd0XPI/BafAkrl+5UE994XI9u+lyrV29WFa9c3Xv5wQgX5KOqJ3lnEs3TwQ0QdTISf/solZt2j6lkGqr2yrV07mgF/qQ+rIePayeSq1ebTZrxsn/hybtPmCS7lizdPL8RxXf7S8VtfGKC7rycwKQL0kDtf9lZkuccyNNPRogxoahkdDRl2LB9KvXj0+uOfLXPt1+1RLdftWSlrVVqrdzQbf3IfVlHTjXCr5Gx8YnP4Mko3alYmFaYkTUa8yZNaMnPjMA7Ver1+eIKv9RnSHpo2b2E0nHVPmPp3POvaP5hwhI1931uHY8c2Ta9jkzCyoW+qatH/LXPmVRgDUJOhfUlvXoYZLga2x8Qhsf2h/Zk9RXMAvNXq01XZvn/q8AukOtEbXfbMlRADGGhsuhQZokvT5+QkffCB9VaWXSQCckLuRBlqOHSVs/hSUBBIWNpNV6jTP7Sx3R/xVA56vV6/P5Vh0IECWuVtWEcxqIuZhuGBrRvbsOacI5Fcx07YoFum1wSebH2EvZm/U4Z93Wadue23T5tG21RqiCmZsh6/tTG6gxChY3XcsoKoBWSJr1CbRN3KhJwSwyc/Kct5R0986DU2qu3b3zoDYMZb/UspeyN9MKC9LCttfqLlCduRk2kZnmD9pAf6nm1Hhcgd+o0dK0Dd4BIE7SZAKgbQox64uuXbEgcu3Tp+7bF/qce3cdynxUrZeyN9NI2mJpaLisT923b9rnHByhSpK5edrsYuJCtkmnpaOma6NGUU2V99Prnz2AbBCoIdeGhsuxi8D9gCvsYnrjlr2hz4nbXyN6JXszqQ1DI7pn58Gaj/NHyqI+Fz+gSjJSlabbQKPT0mtXL9ZNW/ZOG9lzEtOfADLD1Cdyy7+ARxmocaEthFUpjdmO7AwNl3XPzoOh05PVao2U+Qv3s/zUspiWHlw2EPn+SCIBkBUCNeRW3AU8yYX22hULUm3vVEkanbfa5m0HEgVpUnxQE1y4n8U4aD2N5ONE/WeBJBIAWWHqE7kVdwFPcqH1p0VbkfXZLu0uERGVpZlkRMnP+oxa6xWsbXZTxDR2GmFZpo2qt4hvdV3AVYvm6Z6Pvzvz4wPQ+QjUkFtRF/CB/lLiIOS2wSVdFZhVa2eJiLggMW6hfbBFkxQd7ASD8aQ106oVzPTM7Zelfl5S9SSRhBVv3vHMEV131+MEawCmIVBDbrW6V2cnaqTQbqNV9eOCxLDPziRdt3LhtNdIEuyE7S+JZiWOBKVNIokq3hy1HUBvI1BDblHyorZ6C+1mMWUaFySm/exqBTv+fbc+vD9VZmethBMAyDsCNeQO/ROTq3fUMYsp01pBYq3gq/pzvvj8+XrsycOxn3uaII3RVwDdgEANudLuxfGdpt5Rx3qnTIPB1WmloooF0/jEyenFpMFR2Od8d6DmWvXnvmFoZMr9tcydXdQtH7wglz8zqxbNC53mXLVoXhuOBkDeEaghV+ifmF49hXbrmTKtDq5Gx8ZV7DPNnV3U6NHxVKOfSboM+J+7pESFc4NeHz+R6vGtdM/H303WJ4DECNSQK40sjkdy9UyZhgVX4yecZs+coeHPXJrq9ZN+nuXRscgOE3HyHtwTlAFIikANmRgaLuv3HnhCx46fHMmoZ5SgnpGesKbfzaiZ1U3qmTLNsgl5veU20iC4B9AN6EyAhg0Nl3XzfXunBGnSydpQaaxdvVilYmHKtriRnrAgLW57t0vTpWBw2YB2rLtEz266XDvWXVJz9CkqWPabkKcR9jlnje4AALoBI2po2OZtB3QiolxV2tpQlOSoX7MTMdauXhw6DVlPE/Lg59yMkbVWZHwGEyv6ZxflnPTKWLq1egBQC4EaGpb1FFM9i+PR3ESMd9zyLb16LHrxfz0/A/7nvGrT9rqDNZPU12eaCPxPwSRdfVFzf4aqg+Jg2RAylQFkialPNKxZU0xx03j+fTgpSSJGPQ3cawVpUmM/A41Mg57ZX5oSpEmVEb7Hnjxc9/EkUStrNZixCgCNYEQNDYuaEpOkYp3/FYibxpNUVzuhblcrEaPeqdFaQZqkyWnGeooVDy4b0GeGRlTPmFq7soST7J9kBgBZYEQNDRtcNqDrVy4MvW/zNUvr2mfcNN7Gh/bXDNKSZH3WM7qUZ7USMeLOaaNu2rJXyz77ba39xj6VR8fkdDIQTHJekwSD1Z7bdHnkSF6zEwmS7J9kBgBZIFBDJm4bXKI71yzVQH9JpkqPxTvXLK05mhIVLMWVghgdC28jZKpcvJMGaesfHKkrqMirwWUDuv2qJVM+g9uvWjL5GTRz9Mmpsk5rvGoaMkkgmOScz51dnPJz5X/GabOEs1Jrupb2VQCywtQnMpM2CSBuKi5qGq9gpgkXnmKaZgSjWzsgxH0G9TZwP3VWoa4RL191IOhPj5ZHx2SqBHlxTIosqNuuLOHq1yXrE0CzEKihLaJ6N/rBUlTl/LgpzzQjGL3YAaHeBu5P3Pr+aQkFp84q6JfHJmoGWdLUQLA6OE/y/FNqLHRsV5Yw2ckAWoFADS1Xq8H2C6NjkSMlUXW35s4uprpo1ju6FCY4QuSP+A3kcFSl+pyeVirKrLK+zA+Odz9/RPfuOqQJ51Qw07UrFui2wSV64tb3T9tfkrIa1YFgkh6f1cbGT2jZZ7+dup8oAHQDAjW03L27DsXe7wdLUSMWYaNCt3zwglTHUO/oUrXqESJ/WjavtbT8cxo27XzzfXunFC6ecE537zyoZw//KrQVWNg5DCqYTVkj579OPfw6ZXk9rwDQLARqaLmoNWZS7WApqzVJWe0nboSoVWve6imJEXbccd0lhobL0/bp37714f1TCr5Klc+xOkjLKlEjyXmt55zUem4j+wSAehGooeXiEgKqL+5hsloblMV+aq1pa/aat3pro6U9rqjAKDhCVyuI+f0Hn0j1mnHijr+RVlrX3fX4lLZn/nN3P39ED+wpN609FwBEIVBDy127YkHoGrXrVy6MvOhVX0BXLZoXOh3XalFr3YL3N1NU9uqNgXVn1ed0aLisvphgOUwjAWetNYlB169cqMeePFxzijTsvAbXClZLMgq3YWgktDft2PjE5Lq9tPsEWoHR3u5GHTW03G2DS3T9yoUqmEmqjLBdv3KhbhtcEvr46iBNqkzHXXfX400/1lri6mm1opZWXAAVVhvOH21KE6RJ8QFnXE26NEHa7GKfbhtcorWrF8tiHhd2XoPHEKVWsHnPrujjjDpf3ZwljM7QjTUhMRUjamiL2waXRAZm1cJGOeK2t1JwrVs7sj5rjehVj/rUk3UZDIzC/uceV5MuafJAn6QvXPUOSZVzGtWSTAqfHk/yvqKCTf89xcWuUdP1dB9Au3VrTUicRKAGxAgLTKTpSQg71l3SluOrlXkpTR31STsC5GduStKyz357StKA/z/3qNdOGqSVin26/ap3TLmoDEQEoAP9pdCLT633FTYKt2FoRPfsPJioltu1KxZMWaMWtU+g1XqxJmSvIVBDy2wYGgmt0ZVXYYvS135jn2TS+EQ+ynBUj+iFCY761BqBq3bCG0WKCsjGxidik0NqiZryjiqfcvH587Vq0/Zpa3Hi3lfY6GbYdHqUmQXTbYNLtPzseawDQu5kWRMS+dS0QM3MTpH0fUmzvNe53zl3i5mdK+nrkt4iaY+k33LOvWFmsyT9haSLJP1C0hrn3HPevtZL+pikCUn/wTm3rVnHjeaovjD6NbokpVqbFrRq0bzY12x0gW3YlEJ1L0up/dMMUbXRpOmjPmnrmJ3ZX9KtD++PHbGbcK5m14goUZ99WPmUi8+fH5l5GRXYhU2TDg2XEwdpfSb95w9dOHlMBGbIm6xqQiK/mjmidkzSJc65X5lZUdLfmtnfSLpZ0h3Oua+b2Z+oEoB9yfv6snPubWb2EUl/IGmNmb1d0kckXSDpTEn/w8z+iXOu/uaDaKm4C+M9Ow+GXqyTBGlxWZ+NlGjwpZk6yMM0Q63acOes25pqf8WC6chrxzQ2fiL2cQUzvXPhadr5k5dTjaz5jdWjVAdGqzZtj1yL40891wrM05yDPHaXAKq1q98tWqdpgZpzzkn6lXez6P1zki6R9K+87V+VtFGVQO1K73tJul/S/2Nm5m3/unPumKRnzexpSe+S1P6UPySyeduByPuiLutxQVqtC7z/mo0usE0zTdjuaYbq0cM71iyt6w/1QH9pssn4r14/XjNIkyojamkTO+5cszT1sdVai1NrxCtpkJakUTyyQVmJbDDa292aWp7DzApmtlfSS5IelfSMpFHn3HHvIT+V5P90DUg6JEne/a+oMj06uT3kOcHX+oSZ7Taz3YcPH27Cu0G92jHalMUC27jSG0HtnmYIS8+/ccteLfvst1On6O9Yd4me3XS5Zs+cETrN26hSsU931hlERgXDWQfJ/rumzEFzUVYCSKapgZpzbsI5t1TSWaqMgp3fxNf6snNuuXNu+fz585v1MkhhaLisVZu2Zz46cc66rVq0/hGds26rVm3aHvqHPYuL+uCyAd1+1RIN1HhOkm4KzRRVmuLlo+OpLnwmTZ7PZgTXqxbN048/94G6z1VY4JxlkDxrxvQ/h/4oLLIXN+oN4KSWFLx1zo1KekzSuyX1m5k/5XqWJP8qUpa0QJK8+09TJalgcnvIc5BTSQqQStKcmVMvvH5wV0t18/PqYCSri/rgsgHtWHdJZLAWVS6ileKCqjQXvuCoxmmlYkZHd9LfPftyQ6MlwcDZVDn3WQXJd65ZqjeOh0/z5mH9YTeirASQTDOzPudLGnfOjZpZSdL7VEkQeEzSh1TJ/LxB0je9pzzk3X7cu3+7c86Z2UOSvmZmX1QlmeA8SX/XrONGNpIUIO0z6fP/8mQiQVjWYhJha8+yWGAbXD/TP7uoYp9NmQ5s95Snr9ZauvLomFZt2q7rVy5M1CVgbHxCpxT7ItdqzZlZ0GtvpM/lGT/hGs6OTboWJ6wUTK39RpU4aff6w25FWQkgmWaOqL1V0mNm9oSkH0h61Dn315J+T9LNXlLAWyT9mff4P5P0Fm/7zZLWSZJzbr+k+yT9vaRvSfokGZ/5l+R/xX4LKV9UcOePoKR9PX807NlNl2vHuktSB2nB9TMvHx2XTOovFTMfzWlUkrV05dExbfnBocS/8KNHxyOnrOsJ0nytGC3x21b5o65+KZjrVy4MfbyfnNLsqVVMxfkGkmlm1ucTkpaFbP+JKuvVqre/LumaiH19XtLnsz5GNE+SjMnqEZa4qZBWNz8PraE24TRn1gztveXSTF+rUf752/jQfo2OjUc+zi/Sm4R/PtPWXTNJ/bOLUzoYhO23me7ddShye1zGMGUOWovzDSRDZwI0xdrVi3XTlr01EwmCwVncVEhcq6Rm/C+8U9bPVJc3+M0L36qtT7wYGSglETyfaaeiS8U+/er145H3l0fHtPTWb2vjFRdkdkGuPgdRtdyS1HijzEFrcb6B2lqSTIDeM7hsIFG2Z3CEJW4qpDoD0582bdYUZKtKQTQirLzBPTsP1hWkhU3pJs16DRo7fqJmWY/RsXGt/ca+TMowhJ2DKNVT7QDQCRhRQ9NENdb2VY+E1ZoKaeX/vjuhLUvY9Gy9pVDCpnT9kao0059JGxMEp70bKXqaJGnFVyuhAADyiEANTTE0XNbRN6ZPgfmZhFHtefIyFdIJ62fSTsPGVdyv3le9GbhpGrS/MDpWd6uvoeFyzTV5/rH4WZ9RfUUBIM8I1JC5qIt8f6k4bW1SdU/PWj08WykvQWNQcPSpL0VQZJL+90Xz9L+eORIarFVP6aYZqfKVigVdfdHAlMbpcc7sL9XV6mtouKy139gXO8U60F+a7P8JAJ2MNWrIXNRFfs6sGbFBmlTp8XndXZ3XxtUv1HtuTLeELF4juB4rTQN0p8q5DXtG9ZTu0HA58XRnyau35q9tu21wSaJ1bcU+09rVi+tK2ti87UBskJa3KWoAaAQjashc0otvVCPv6u3Nbtzc6P7rnb5L69aH96ce5apl7uyibvngyVHOoeGybr5vb+Ln//hzH6jrdTdfc2HdRWZrTfnmpb4dAGSBETVkLsuMyWY3bs5i/63oWTg0XG6o5EaU2TOnjnJu3nZAjfRiT9I6LJh7WU/R07ifozy09AKALBGoIXNZVhxPEgTVO+04NFzWp+7b13CQ1Yqaa2mOx5+KTCIYUKWZ8pQUWjw2ydo2p5PvJ0n/zg1DI1q0/hGds25r5etbSir2TS+1USwYU54Aug5Tn8hc0ozJVYvmhU5/rlo0b/L7WkFQI1mD6x8ciVznlSbIyqpnYXUmY3BaMs3x9Jnp4vPnJ17Uf91dj+vc+W/SPQn6gPqiKvwnPc7g4+KSNvx2UL4J57TjmSNatWie9r/wy9BzBQDdhEANU2S1HixJxuQ9H393zazPWkFQPVmDUc8L238ScTXXkp7PsEzGl4+Oa+39+yTFt2WqNuGcHthT1tUXDSTqUrDjmSOR6wWrXb9yYWyZiyStwyTptFIx9v5aNdx2/uRlPXP7ZTVfBwA6HYEaJrVqUXxQrVIctQrP1jvtGHd/2mnaqBFESYnPZ1Qm4/iE060P70+9Pm1sfEL37jqkP/zwhZP7T9u3s1p/qajlZ88LvS8YWMXVa/PFNQlIUsMtTcYrAHQyAjVMqnd0SqpMUd2761DmBUZrTaPWO+0Y9byCWV1Zg2EjiKs2bU98PuMCx3qTCCac0/oHR3T7VUu0Y90lWrVpe0PB2ujYeGigWR1YOcUX15Wk0Yj35K8brBWI0Q4KQK8gmQCT6h2d8tcR+RfXCed0986D2jA0kslxDS4b0I51l+jZTZdrx7pLpgQJ9SYuRD3vDz98YWajh2nOZ7N6iAYTIy4+f34m+/vUfVP7dEa1shroL0UmNYS931rrBoNoBwWgVxCoYVLSshrVWZZf2xW+CP3eXYcyP8ZqSbIGs3xeGmnKlKxdvTgyk7FRfqumB/ZkU9LEH6nzg7W4gDRNIJ0kY7RgVnOdXCu1otAxgN7G1CcmJWlEHraOLUr1yEgWiQpR+2hWwkMj0jR2948jLOuznjVqQaeViommE9MITuHGTT+n6Zlaa91g3grZNrqms9mFnAF0BwI1TEpyUU3TAzK4jiiLRIVa+8jbha/6fPbPLso56aYte7V524FpxxcXOK69f5/GJ9IHWsU+02tvHE8VpJ06q6DxE6r5OfuBVZqANKj68zqtVAxtsl7vusFma2RNZzsSdwB0JgI1TFFrlClNPa/gOqJGLmpJ9iElz7BsJf98Jr0wxyVl3Lhlb6LX9BfyD/SXdPSN44lH40zSHWuWTgl640ZM/SncuAA/6n3vfv7IlDpv5dExFQumYp9Ny349tZTPP1ONFDrO4vcBQG/I519A5FbUNFep2Kc3jrvIrM8sqvfH7SPvF74kx1ddU85Pynhwz0/1haveoYGIc99fKmrOrBmhI4nnrtua+BirOwYE+3/WGjGLCvCj3rcfjAaNTzjN9UYdgyNrLx8NzzZtt0YKHbeimwWA7kCghlSiprlqTU1lUb0/ah99ZpEjP6268NWadq11Yd4wNBJZdPbo+Amtf3BEV180MK3bQKlY0MYroivyz5zRp2PHTyR+H+XRMd24Za82PrR/cr9p1plFvb9qUVOxo0fHdWZ/adoUaJ6Cbl+9U75Sdt0sAHQ/ArUel3ZdV9qL9jkxIzppC8uGXRilykU/qm5XKy58SaY14y7M1SNpYcbGJ/TYk4d1+1VLIs99dQuqRlTXTKs38SJpp4Lg4ztltKmRALaRIA9AbzHXhRW+ly9f7nbv3t3uw8i9qCmtrBZuxwVpAw1kfUZlMFYHaybpuhaUcogqJDvQX9KOdZdIij7XZ809RU+99Fri1xrwApmwIK26BVUWgu+hHkPD5ci1ddWfl/+zF7U2rtFjyZu8Jb8AaB8z2+OcWx52HyNqPWzjQ/vbtq6r3gvu4LIB3RRx4a+uiO8kPbCnrOVnz2vq+0kyAhSWAfr6+ESqIM10shxKeXRMN23Zqxu37J1MGkgbpBX7pNNPjR/xauYolp/wEBaoVAedxT7rutGmZpeHAdAdCNR61NBwOXKKLIuL8/u++N3Y+89dt7XuUYS49k/VI22tCDyTrjeangGafO1Y2NSuf7vetlCbr1kqSaHTyb6wYsf+iJd/vuNGR/3khCiRAXt1nV86RgHoUXQm6FFxF9C4dV1JK7HXGilyOrmWK20196hq91EL1Ju9tiltG6s0teik2n0z6+F3PPA7NMydXZz2mKhix35g6J/vuM+xnnO/eduBaTXjxidczaAvDJ0DAHQ6ArUeFXcBjQowghfqRgKtoGAdtKSi2j+l6SuZpeDxSJWRPf99ZRG8OGXfhDwY+AwuG9DwZy7VnWuWxrbUigswoz7HuHN/3ulzQrdHnZ/y6FiqgKsZP68A0GpMffaoqOm6ubOLkdOESWuVpb0Q1jPqErW+p12ZdP6xJClqmzYTUqqMXpWKhVQjcbVUn/dGix2H3R+VqXvGm2fq0ZvfE7qfuPMTDLj8Y47SzjWYAJAVRtR6VNR03S0fvGDydvW0UdJaZWlHyLIa8WpFo/U4tTonDA2Xteyz365rTdlAf0lXXzSQ6VKttOe91uPD7g/7TO5cs1S7Pv2+yP2E/WxWqzUS2+w1mADQKoyo9ahabX+q63GVR8cS1SobGi6nCkSyzuZrZyZdXCA7NFxuqF/n2tWLtXnbgczWqqUZaQwmEET9DMTtL+1nUv2zGfWe4wKuetdgAkDeEKj1sLALaFi9L191+Qvfa8eOT053+lNSSb3plBldMQ01NFyODWTDFsgn5Z+jqLIkac2dXdQtH4zuZhBU/fMQ/BlIkvVZr+DPZtRoblzAVc8aTADIIwI1TFErI9GpcqEPNvr2q9ifUuxLvYbq5aPjWrVpe91FP8MKqpqkZzddnuo4GhU32lVv+QzfqHeu61nbFub18RPa/fyRRMVWw34e/PpnrSo+e/H583XPzoPTiuPGBVxJ1mBuGBqZ7Dka1p82ShaFail2CyAp1qhhilrrdwb6S5o9c3p8PzY+MSV4q9Zfml7+QTpZxLWerLyoqvdO6ZqRZ6GZ6578kaOLz5+fyf7Gxid0z86D0877hqGRaaUs4jIwz1m3VSs+/2gmxxRlaLisB/aUp3WcuPqi+OnUWmswNwyN6O6dBydLjEw4p7t3HtSGofgR4SwySclGBZAGgRqmiJtO8kcx0gYlA/0lbbzigmkXzrCpwjTlOm59eH/kfc1ujFadaNEfUocsC/459wOLWgp9putXLpyskxYl7LxXB283bdlb8zz+/JdvNDVYixrRe+zJwzWfe0rx5J+3/lJxSmLJvbsOhT4nanvc8aQtMZPFPgD0DgI1TBGVcTd39skLXVQw118qRhZ+Dcv+q2eReFDcCF6z+JmbN27ZOyWo+dXrx2sGR2kVzHT7VUu0+/kjiYI0SfrDay7UbYNLNCdk1LOWqM4Htfz8l2+kfq2k6mnQ7iduBH8+Xnvj+JTHRBVHjtreyPE0Yx8AegeBGqYIK94qSa+OHdeNW/Zq1abtuvj8+aEB2cYrLggtjyFVFoT7i+HvWLNUO9Zd0lCB2nZME20YGtGNW/aGBojjJ5zmzJwR+Z6qhXUCCCoVC/rDD18oSYmDtILZ5IjRKxGlKaTO6sYU9bMQ9zNy68P7QzsbBEdgowoI1yosXM/xNGMfAHoHgRqmGVw2MDmyFlzDI1VGjx7YU9bVFw2E1isbXDagHesu0bObLp9cbB61Hids9K7YZzr6xvHYCvT+Gp84WQcjQ8PlmgHTK2PjOuctyS62caOBs4t9k+czbA1elOBoUNRFv2Cm61YuDJ2GzqO07bmk6HMb3H7tigWhj4na3sjxNGMfAHoHWZ8IVatd0GNPHk6U9Re1HudT9+3TCed0WqmoU4p9Gj06rtNKRb32xvHJC2pYBfqh4bI+dd++mlNUWWd9Jlk/dFqpqB3PHKn5uOc2Xa5zYpId5s6ZpRu37E0VpEmaMpoX1hGgVCxMBoDLz543Jevw4vPn64E95bo6H5zx5pmpn5NUXL2/RvjZnWmzPrM4nma9JwDdiUANoeppF5TmcX6gNTo2rlKxoDvWLNXmbQemVZMPtvwZGi5r7Tfig7Q71yxtygWv1vstFQtK0o7Tf0h/qRhZOb+eEhzVIzK1goGwGnrLz56nm+/bqxMpMjHOePPM2C4DQfWWpEhbMDfq3FZnHt82uCRROY5Gj6dZ+wDQGwjUMCl4Ie3ziplGSbqeJkntLz8Yq7XIeuND+zUeE0UM9Jcyv/j556RW7HL7VUsSFaT1z9vGKy7QzVv26kTjhxhZcLaeYCBJkFZPDbXqwrl+VumNW/ZmXjB34xUXaO039k35WSn2mTZecUHMswAgnwjUIGn6hTQuSEuzniaqKXc1f5QlrgJ91AhU2mNKIqyNVpRVi+ZJUs3gttBneu1YZf1d/+xipkHa5m0HdNOWvQ1NoyWdaq3nPEeV2ZCSN1lPqhVTixSsBdAqBGqQFL0mzW8TVG+7oOqLZlQw41/swtZVrV29uGaWZ5bN1+PaaIU5d/6btP7BkZrr5iZOuMnAL6vSIuXRsSkBVnl0TGu/sU/S9KAnrhL/O275VqLXW7VoXl3nudbUsb9uMey469HMqcWw0cEsA00ACCJQg6ToC+kJ5/RcgwvzgxfNsCAoWGtNmj4SIsX3EO3LOGWxVhutaknLZ7TK+AmnjQ/tnxI0VBfM9SvxS9Kun/xCrx5L9n6f+0WlwXzagCTJFPiEcx0R8MQVrM3zcQPoTARqkBR9Ic26tlM9i9xXbdoeGzidcMr0At8phUejmsBL06eJv7YrPJhMG2TWO3qUdAq8EwIeCtYCaCUCNUiKLudQvR6pHY2sk1wAs7zAZ9X8PCguqKpX0v0NDZdTZXLWUs+5Dgbotc5t3gOeVv2nBgAkCt7Cs/v5I3r9+MkgLVh01deuRtZJL4BZXeCj2mjNmTl9W5RiwdRfKk4WBL5u5cJMjs030F+K7YLQZye7NzSjh2Q959ovhlxrpjrvAQ8FawG0EoEaJgOw4Fr4o+MntPv5k8Vb4yrzN7uRdVTgVC1p66lgM/WwYDGsL+mda5bqWMJ1awP9JW3+0IXae8ulkx0alp89L1GdtWrFgqlYtQjPDwrWrl487T6fPx08NFyuO4A9dVahoTZfUeKe2wkBT9jPR5bJLAAQZK5GplonWr58udu9e3e7D6NjLFr/SGjGYsFMz9x+WaIsyLiEg7gq/EmzSINTp/2zi/rV68en1MkKVt2P20dctf5a4t5H0J1e8d4sqv7fuWappOg1fbXKiPiBVtqp3PNOn6NHb35Pw+csTNTP09zZRd3ywQsIeAD0HDPb45xbHnYfa9QQWVbC314rCzKukfXQcDl2fVbSxenVSQb1rHmrN1vPf60k7lyzdFrphnt2HqxrfVqwy0LU8fnn5dx1W0Nf44XRMV23cmGqpIGCSZ+8+Lwpr5tlzTBaKAFAcgRqmKyRFibJ1FlcI+skVf3rXZyeJLgKBgL1ZOslranmB1VhGar1jlmnya6MWuBe6LPUmZ0TVVm0zahJRgslAEiGNWqIDbTWPzii06p6JAb1qdIjMkqjPUHrEZW80D87/H3ErZm69eH9iaYs/fV8Wb6PRtfxmaTjdaZ7pnltAEDzMKKGyfIaYSMvY+MTOqXYp1KxEBqwnFClB2fUNFbSUhdZZvpFTXHOmjH9fcQtXh8aLifuIOCfu6xLeyQN/MKmExs9jryXyehktKACkBQjaj0smAH51/tejHzc6NFx3X5VdK200bHx0NIbQ8NlHX3jeM3jyDrTLyrAGB0b16wZJ3/k584uRi6KHxouT7Y0SureXYcSZ6hWK0b8JjopMju12uCygSmfQxKrFs1TIWKJYd7LZHSqRsvVAOgtBGo9qvpiEdd8/Mz+kgaXDcTW7QoaG5/QrQ/v1/oHR6aNSPWXirp+5cKmljaICjBMU9/n6+PhbdE3DI3opi17a/burDbh3GTphrgEi2qrFs3T5muWqhBRaiPphTxpVqpU+RzuXLNUL/3ymCYi3mbey2R0qkbL1QDoLUx99qik/SyDo11J2wBJ0U3H58yakaiTQSPCjjMs87Q6iWFouKybt+xVePhWWzA4SxLkmUl3fPhkZudNgebq1bLsvOCX3pA0paF7NabimoMWVADSIFDrUUkvCsHRrrB1UEffOJ54HVea121EmvVa/vEMDZdjg5Ykrl2xQNfd9bh2PHOk5mOLBdOcmTN005a92rztgNauXlwzOzSLcxcM0tAetKACkAaBWo9Ksth8wJvyDAqrZxZWEHXWjL7Q6dRWXYyqj3PVpu2h79fF3JfG9SsXatdPfqGnXnot2RPcyWlYf2qzzxTbk7ORcxdXkBitlbSvLgBIrFHrWUkWvV98/vya+xlcNqCrLxqYnPYrmOnqiwa08YoLctUPMe79ZpGlmSpIk6Z0VZBOZqVGKRasKefuvNPnpNqOxtGCCkAatJDqMmnS/v3HRgUqA/0l7Vh3Sc3Xi2oxJLWu+nyS913r/cYp9Jkm6qxJloVSsU8//twHaj4uLKGguqVV9bl53xe/OyXIZHoUAForroUUgVqXiOr5mKQvY1T7IZP0bI0ps6hpwyRBXlaigsWrLxrQY08enhagRL3fKOedPkefvPi8htewNSrYUiqpZvTqzBL1xACAQK3r1WpzFAyaqkdP+iSdNrtYMyHAbzNV3UQ9Lsi7I2IkJ+uLc1SwWJ3p6Qdv9+46lKr0xkB/SS94ZUzaqfr9nPHmmdr16ffFns88BNJR8h5EAkCr0JS9y9UqteFnC1YHaVKls8DLR8drLmT3A5vqJupRSQn9s4vTmpOvf3BEu58/ogf2lKdt9/dXj6hsyLByHGkbpJeKhUw7DTSi+rh//ss39I5bvqXxE4o8n3kuBRFXT4xADQAqSCboArUuun62YNxi9zTBS7A4Z9gi/VKxIOcUehG+d9ehzIt9psmGTPo+Vy2ap4H+UqKacY2op4tB0KvHJmLPZ9S5yUMpiDwHkQCQF00L1MxsgZk9ZmZ/b2b7zex3ve3zzOxRM3vK+zrX225m9kdm9rSZPWFm7wzs6wbv8U+Z2Q3NOuZWCbZuqm4PFHdflFoX3deOHdd1dz0e+5i0M+D+xTQqg+2ViE4HUVOOjVyc623bVK1gNvkerlm+sKkBQ/BcJe34kIZ/7FGBdB5KQeQ5iASAvGjm1OdxSZ9yzv3QzN4saY+ZPSrpX0v6jnNuk5mtk7RO0u9J+oCk87x/KyR9SdIKM5sn6RZJy1UZENljZg85515u4rE3TfW6nOBUlaTI++Kmgmp1DBgdG09UhDUNv/6Yvx6q+viisiv9tW7VGrk4Dy4b0O7nj6Se1qxWPb17WqkY21oryqwZfXrj+An1RbzXsPVhSTs+JOWfz7Div3lZsE89MQCorWmBmnPuRUkvet//0sx+LGlA0pWS3uM97KuSvqtKoHalpL9wleyGnWbWb2Zv9R77qHPuiCR5wd77Jd3brGNvplp9/tKs2QkuIj+tVNQpxT6NHh2PDBCyFhdIRl2Er75oYMoaNX978OIcfF/9s4tyTnplbDw2yHjsycOhQVrBTCecSx3AjY1P6Njx+gKnPjNdt3Kh/nrfi9MCvWLf9HpowWAq7Xq4U2cVpqxRk6afz7BAOg/yHEQCQF60JJnAzM6RtEzSLklneEGcJP1M0hne9wOSDgWe9lNvW9T26tf4hKRPSNLChQszPPps1bMuJ+y+6pG50bFxlYoF3bFmaWzPyHpFjYRFBZJxF+HlZ8+LvDhXv69gNmpcYBh1/k44pzvWLK2rtEa9ZdNikxYierX7wdR5v79VEb3ip0mS9Zl3eQ0iASAvmh6omdmbJD0g6Ubn3KsWaFztnHNmlsnQj3Puy5K+LFXKc2Sxz2ao1ecvaQ/AuJG5JO2h0vBLcty0ZW9o8BEVJEVdhOMuzrUyWKMCw6j37BTfeLxZon4AxyfctEbwfpA1o081g7Tq8ihS+mCnkwM7AOg1Tc36NLOiKkHaPc65B73NP/emNOV9fcnbXpa0IPD0s7xtUds7Utzi7jQLv+NG5rJaXO/zR7L6ZxdD749aXzY0XNbSW7+tc9Zt1TnrtmrZZ79dMzkiyQL+sMfU+55nzejTqkXzUj+vEcFG8OsfHFHZq9GWZCTN/yzCzmOSRJTq12x0fwCA5mpm1qdJ+jNJP3bOfTFw10OS/MzNGyR9M7D9t73sz5WSXvGmSLdJutTM5noZopd62zpSXJ+/ND0A+yKm0M70GqnfftWSyf6bWRgbn5Bz08tJRAWSQ8Nl3bxl75Q1Wi8fHdfa+/fFXvCTJBWc2V+aFkRISp1BObvYpz+4+h364cFXEj8niVpn3X+PtUYPo4yNT+jWh/dP2ZY0AKu1RjLt/gAAzdXMqc9Vkn5L0oiZ7fW2/b6kTZLuM7OPSXpe0oe9+x6RdJmkpyUdlfRRSXLOHTGzz0n6gfe4z/qJBZ0qbqoqyTTW+774XU1EzK35QdPgsoHYtWrFPpOsMhWX1Ctj45HdBqptfGi/wgaIqqf+wo4/LgOyVCzo4vPnh2bHXn3RgI6+cTzReykWTF+46h11B0tBfSa99bTS5Dm5+Pz50xImfKaTze4bKf/x8tFxDQ2Xp6wFTJKIEjUlXn0sFKNFuzFFD1Q0M+vzbxU9uPDekMc7SZ+M2NdXJH0lu6PrbHGFa4N/yOLWqo2fcJrrZVSOjo1Pa08Uxh+tq/XHcmi4HFvWojw6plWbtof+Aa5OQgjL+owKIu7eebDGOwjw3mwWtdIWza/0AvWP+bEnD0/2Ga0+/07SA3vKWn72vIbXEgaDpiRJKkPD5cjPuXokk2K0aKe4MkYEa+g1tJDqYhefPz82eHn5aCVT9M41SyVNDY5+9fpxjQfSHpPWt/L/wMYxnRzZCfsDXCsYzCKrdfyEyyzx4unDr2ntN/ZNnq/y6Ji2/N0hbb7mwtCSG2PjE4kTHM47fU5kYB4MmmolqUiVzzeqL2v1Z5tkf0CzMKILnEQLqS722JOHaz4m+Mdvx7pL9OymyzX8mUu1+ZoLE62Vq3brw/trTiWG9eBM00Iqq2Ahq8QL5zQlqJUqt2/csjdVEDjQX9Kda5bquU2XT/579Ob3qL9UO4kjSSJKXE/UsDp4ee1ogO7HiC5wEoFaBzrv9DmJtif9oxb2uGDgtmPdJYmCtKHh8pS6Z2mk+QOcVVarP5U7Xmdh21bZeMUFNYOmJIkop0UEfGGBYNj+rr5oQJu3HSALFE1HezHgJKY+O9CjN79H7/vid6dMiZ13+hw9evN7pjwu6bReVn/8Nj60P/K+gpn+8MMXauND+0PXr0UFEWHCiummnb70A53r7npcx3NSdS9qHU7SCv61poyjkoCjtgf3x5ohtBLtxYCTCNQ6SHUW1J1rltbsAZpkLZSfhdjoscUlEPzhhy+UJL36evhj0lYSqQ5Kzlm3NfFz/aKxkhL1QE2SaJGVuE4PjQZEoxGjnVHbg1gzhFaivRhwEoFah0g6ouEHc+XRscR11JKsZat1bJ+6b1/k/f7U2voHRyLbMiUJFuKcOqugV4/FT2HOnV3U8Gcu1YahkVTdClo94BY1DdxouYJGEgRYM4RWo70YUEGg1iGSjGgMDZenBCBJG7PHXWyHhsu69eH9k2vP+ktFbbzigimvefN9e2P7Ym684oKa9crSTr+e/+lH9HqKGnBSJct1w9BIqjIez226XKs2bc+0JVctYecii6nHRqaTWp0FSg0tAKggmaBDJBnRqLenZZ9ZZAuhtffvm5IgMDo2rrXfONld4PcffCI2SJs7u6jBZQOxwWDatSdvW781dZAmVaYwkwZpM6wyRXruuq167dhxFQvJRieLUS0jqjy36XLduWZp4szKsGzasfEJfeq++E4PQWk6X1RrZRYoXREA4CRG1DpEViMaYeutJpwLHZ3ZvO1AaOcCvwbZ4LIBHY1pUFkqFnTLBy+QVEkWCFvDZlKiYCE4pVuvNKFdcUZh8rVGx8ZrBmCmymdx9I3jiTNfB5cNaPfzR3TvrkOacE4FM1190fTpnrhs2qjPLu41045M+ed+bHxCBTNNOBfaHD4rrIcDuhsj5ukwotYhshjRGOgv6Y41S0PXroXVMosbBXthdKzmCEcwAItaLtfvjbjFCY6wtEp1oFBdJ63aHV7R4CRB2vUrF0qqvK8H9pQnp6gnnNPdOw9q6a1Tm9fXqjGXtg5dGtXnfsK5yZ+7Zv1hZT0c0L0YMU+PQK1DNDJtJZ3sBrB524HItWvVF8K40boz+0uxwYHZ1BGerDMO8yZNIOknb0S9r9Gx8Sl/uJIEKHEJCMHm9Wn/GCZt4p4lamgB3asdf1M6HVOfHaB6mPiOiLIcM0yRNcH8zeXRsdh+j8HXOq1UVKHPNFE1mlTsM61dvTi2ldN1KxZO23fWGYd5kiaQ9N9P3PsKTvUlqRPXrASEdoxudVINLaZwgHQYMU+PEbWcSzJMvGFoRIvWP5K4cKtTZYQtqFQs6OLz5095rdGxcfVJmjPz5JRrf6mozddcOBlAhJld7NNtg0umbEs7dRscCcpJPdrM+OetVpDq/+Gq1Ykh6jxm8T/XqGNMU6A4rUZHj1uFKRwgPUbM0yNQy7laF9vr7npcd+88OG068/qVC/XcpsunBWQ+J027ED725OHQtVn9s2dO9p7ce8ulkxfMqODrC1e9Y9rrpbn4Vl8Au0kwqKoVgPl/uKrP3dzZRfWXijXPYxb/c127enFoIsVrbxxvakBSTwuzVmMKB0iPPsLpMfWZc3EX26HhcmRl/Xt3HdJtg0sip80G+kvase6SKduipjKjjiFt9XA/49CfLrppy15t3nZg2nNasSatT1J0vmo65s0lhwWVxT7phLPQrE7/a7BOnS+sl2faYCWLTOHBZQOhxzc+4Xo+C5MpHCA9uk6kR6CWc3EX27j/ufsjbGnW+8S9VtRanDQBxNBweVqvz/LomNbeX+lq4O+nFRe6f7Vyoe7ZeTCTETvnKiOYYTXaKtVLTmZ1PrCnrOVnz5sSrAWD1yz/cGW11isq4aPXA5JWFwEGugVdJ9Jh6jPn4oaJ4y6UfgmONFOOUa9VvXatnrU4/nRmWC218QmnWx/eP/m4Zk93nnf6HD325OHQ1zFVgq7q81CrjO1tg0s0d3btdVtRU2PNmOrLaq0Xa0rCMYUDoBUI1HLOv9j2BxZvn1KsfGxxF8prVyyYso8kQUDUhT1s7VratTi1pjNfPjpe6YTwjeieoVk47/Q5evTm90QGuU6VoKv6PCQJHpP2K23lSJT/2ft13m7asjd1mQ4CknCdkvQAoLMx9ZlzYdOFLx8d19r792nNP12gB/aUpwVAp84q6O6dByen4lYtmqd7Pv7uRK8XNiSddu1amCQ1xjZvO1CzsGwj7gyUNYnqlCBJqzZt18Xnz5+ybe7sYs1itknKaPiPSyKr6dBGy3SwpiQaUzgAmo1ALceqL7BB4xNuMhDrM+mEq/yPfvbMPj310mtTHrvjmSO67q7HEwdr1bJYi+O3HorT7JEmfwRwcNlAZKcEqRLIBNeblUfHYltIzfDuClsTVi3pSFQWNdB8WbRkIiABgPYgUMuh8z/9SKqm4/4g1MuvHVN5NDyXccczR3Tu+q26bsXCaTXOpEottmDPyZW/PlePP3MkMjMy7dRXrSBNSj4iVa9gsJN0mtI3fsKpP2IU7r98eKmkkwHUp+7bF/p+C2aJp8ay7HcZFQCXR8e07LPf1i0fvGBynxRwBYB8YY1azqQN0oLiGqRLlezEu3ce1IahkSnbNwyNTKnFNuGcdsQEafWsxelPUCC1FWue/GCnnoXwo2Pjun7lwmmJBcHEisFlAzoREZSecK7hjgDl0bHU7aDi3qs/jT40XNaGoRHdtGUvBVwBIEcI1HKm3iAtjXt3HYq9XUt1QkKSfpJvHM9Pr84XRsdqFpsNY1YJdKs/oerEilpZkknOV1xwlTaIqvVexyecNj60P7RcCQVcAaC9CNR6UPW0XJJpyShJ2+jUGu2TKiNTUSNvMUvEUjuzvzQlY0+qXX5DqoxIRgmOgMVlSSY9X0kCyaRBlP9e44yOjUdmtvZ6vTQAaCfWqPWgQtVK+iQL/aPUaqPjr3dKYmx8QqcU+1QqFqYVaT1r7inTkiTq5Wd0BhfIB9dm9dVxPoIjYHFZkqs2bU+09qx6H40GUVEdBpLo9XppANBOBGo50qq1QMEaa/7tsKr6Yc47fc6U21GL/8ujY7oxoqxHnNGj47pjzdIpQU5YJmsjHnvy8LTkiWtXLJhsqRWXbRulen1dVJZkmrZDwX2s2rS94czbuNgzqvyIKf3aQRISOg+fGZBfTH3mhB8cRCkVa39USRbszy72afnZ86Zsu21wSegi+TCfvPi8KberR+ca1Wc2WbftjjVLtXb14kyDNOlk+Y1g8kQwySLJVGHQ7GJf5EWtej1af0T3gloBVxZFZ1+JqBsnSbd88ILQbgzXrVyY6oKddGoX+cFnBuQbI2o5EVe5v9hnGotY4zV3dlG3fPCCyX0Ey0f4ZTZ+ePCVyX0fHT8RWY8ryWRf9RRdI+vbwvj7q3dErhFf23VwsnTJ4LIBbd52oGa5kEKf6QtXvUPS9FGJi8+fP6UgsV+PrVgwjQeSRqICrur9XX3RgB578nDdox5R5U8GvDV7UuNFbbMsK4LW4DMD8o1ALSfi1hrFVet/+ei4PvWNfZoIeYxfZqNa9R9hvzxHEuXRMQ0NlyefO9Dk2meN6LNKIDWeMJP2hNOU97Z29WKtvX9f7PP9cc6wArXhTdor9djmzJoRGxCF7e+BPeWGWhTVatKeRVHbNFO7yAc+MyDfCNRyopFir2FBWi3BP8Jpy3MER+TCLv6mZKNzzXbCSafOnDEZFKUdMfS/xi3CHz/hJhMnkq5pe2VsXHtvubTmccSNctSzpqgVraCy6GKB1uIzA/KNQC0nkrQfylLwj3Da6ctgwBB28b/4/PmhNbnaYXRsXL98/XjiY6keRQi+x3PXbQ3dT9qRh9MSrCWMG+VopL1U2lGztAFhrVE75A+fGZBvBGo5Uav9UJaq/wjXU54jGEiEXfyTTqW2Qpr3FjeKUGvkIemIaJL8i7jXatWaonoCwnY3cCd7Mb12f2YA4hGo5Yj/hzHrkbVin3T6qaVpf4T9i1o9gWE7p0UKJjWjgUOtUYRaIw83bdmbaOQuSS2zuNe6KSLJIus1RfUGhO1q4J5lI/te067PDEBtBGo5E/zfbVaL9I+f0GSNMF89tcJ87Z4WySJIe27T5alHX2qNPOx+/kiiKV/T1KSFtK8V9bORdfDcaYvMyV4E0I0I1HLI/9/tOeu2ZrK/sAt4XDmQWqozD8MCnjzza7/VM4oQ95zbBpdo+dnzak5fO00vc5LmtVq1pqjTFpl3WmAJAEkQqLXR0HBZv/fAEzp2vHYfzEaUR8cyC/okTQvSoqab8qq6M0OWkk5fNxI8tGpNUactMu+0wBIAkiBQa5Oh4bJuvm+v6qis0VZzZk6tXh813ZRXqxbNmyxqGxQ1DdpoGYyo6etGg4dWrCnqtEXmnRZYAkAS5pqcYdgOy5cvd7t37273YcSK6t2Yd9evXDgl0IkqWZFHc2cXNfyZ6fXLwtbrlYoFXX3RwJTOAv72NEVnw/ZdXWdu1aJ5uufj7079fpK+fqcEWlnotfcLoDuY2R7n3PKw+xhRa5NOXTfz2JOHp9w+rVSc0rYqz0Yjsi2jRgX9pu3V29MsTq8elSoWTG9UZUPseOaIrrvr8cyDtV7MgiR7EUC3oSl7iw0Nl7Xss9/umFGoatWjgK++3hlBmlRp+B7WaDoqaI5KCEgbZA8uG9COdZfo2U2XTwvSfGGtvhoVlwUJAOgMjKi10NBwuWbvyE7gJybMmVnoqDV2E86FjihFLUKPKgTcZ6Zz123N/dQaWZAA0PkYUWuhzdsOND1IS1D0fspjBxpY1P7aG/lNGogSNqK0dvVilYpTkyRKxYKuXbFg2napEvA5nZxKDBuly4OohAWyIAGgcxCotVArRjKcpGKf6c41S3XnmqWxj3120+XTCuH2grB+nrdftUQD/aXJ4PX2q5botsElU7YXQno/pZ1KXLVoXqrtjYgKQMmCBIDOwdRnC0VNsWVt/IRLHDzkdTSomfy1asEpy6hF6NVN2cPEBeBRxYCDa9KalfXZaeU1AADTEai10MXnz29Zs/KkAWG3LyyvLoUhRa9VqyVtQdWorMvbr1rStHIc1ciCBIDOxtRnC1WXtsiDbl9Y7pTNlKVUCbTTbG911uXQcFmrNm3Xueu2atWm7T05WgoA3YYRtRbKY1DUqunYdhnoL2WW/RgVaEdtb2XWZatqplFQFgBaixG1Fspbtt3QcFmvHTve7sNoGn/hfFbZj2kDr2ZnXQZH0D51376mj975wWB5dKwjsl4BoBsQqLVQWBZevar3k6Ysh2/9gyMd01UgqerMzcFlA5llP6YNvJqZdVkdNGVVnDcOBXQBoPWY+myRFZ9/VD//5RuZ7a/6gllPdbY8N0+vl19uxJ+iu2nLXp3ZX9LVFw3osScPR07Zve+L39VTL702efu80+fo0ZvfM2XfUckg1WvUgtODp5WKOqXYp9Gj45lOFYYFTWH6Zxcbfi0fBXQBoPUI1Fog6yAN8cLWaz2wpxzZTL06SJOkp156Te/74nenBGu11qgNDZf16b8amVIIeHRsXKViQXesWZrpWq6kwdGvXj8+rRRJvdJmvQIAGsfUZwsQpLWGn92ZdoquOkiL2h43ouS3Bwvr1pBmejBp5mbS4ChNTb1aKKALAK1HoIau4a/TatYUXdwatVrtwZK8dprF+mnWO2Y1NRnVwYGsTwBoHqY+m+x9X/xuuw8h0syC6Y0ObxAf5PctbdYU3drVi6dMqUonR5Ru2rI39rlJXjtuJLA6GArrOvDaseOhySFZTk1SQBcAWotArYk2DI1ETqvlQacGacWCSa4yrefzA6ah4bKOvjG95EjcFN15p88J/ZzOO33OlNtxLZk2bzsQWY/OpETTg2lHAquDpuq1eRJTkwDQ6QjUmujeXYda8joFs8jyDN1mINAvM6yHZnWgIkn9paI2XnFB5EjQoze/J1HWpxQ9orR29WKtvX9f6PTndSsXJhqFanQkkN6eANB9CNSaKKvgya+uf1qpqDeOT+jo+AlJ0tzZRd3ywZMByDkRTcO7wdzZRQ1/5tIp26oDkFWbtoeWrJgza0bNYCUsKEvD3/+tD+/Xy0cr04+1AsRqcVOraY6DwAwAugeBWpNkWa3dH2WpXn/08tFx3bhlr27cslenzip09cja6NHahXnbXecrLEjysziTjHAxIgYAqEag1gT+WqFWevVY9xWvDTqtVLtwa97qfNXTfzNqRIwemwDQmyjP0QRJq8bjpFkz4n8UX3vjeM1RyrzV+cqq5RI9NgGgdxGoNQEtddIrFQuxdcHGJ2oXbs2yzlfSwrNxspqKpccmAPQupj4z5E9PdecqseZ6ZWxcd6xZGlvmIhjgVE8F/nLsjSnTv2e8eeZk38+0kk5ZRk1H1vo5SDsVmybgY4oUALoLI2oZCU5PIb3TSkUNLhvQjnWXTBaureYHOGFTgdVr9H7+yze04vOP1nUsSUawoqYjNwyNxP4c1DMVG9cRIaiXp0izGAEFgDxqWqBmZl8xs5fM7EeBbfPM7FEze8r7Otfbbmb2R2b2tJk9YWbvDDznBu/xT5nZDc063kaxLq0xbxyvnLuh4bJeOxZfsDbpua63x2rUCFZ5dGwyGPjUfftCg7l7dx2KPLZ6p2KTrr3r1SnSXg5QAXS/Zo6o/XdJ76/atk7Sd5xz50n6jndbkj4g6Tzv3yckfUmqBHaSbpG0QtK7JN3iB3d5w7q0xhwdPzF5wa0uQzJ3dnFKgJPmXNczwhI1gmXSZDAQVQYlartJ2rHukrqmIZOuvWt3eZJ26dUAFUBvaNoaNefc983snKrNV0p6j/f9VyV9V9Lvedv/wjnnJO00s34ze6v32Eedc0ckycweVSX4u7dZx12vqNIQSC5qpGz2zKkFa9Oc6+AIixRdFiMorPCsefuqJaqWXaMlQpIUss1beZJW6dUAFUBvaPUatTOccy963/9M0hne9wOSgv2Wfupti9o+jZl9wsx2m9nuw4cPZ3vUCaxdvbjSgxJ1mTOzkPiCGzYVWEuaEZawEawkQVqpWNC1Kxa0rURI3sqTtErSNXwA0InalvXpnHNmllmCpHPuy5K+LEnLly9vS+JlWJ9HJFMs9OnM/pmJRoTCKvgnGWFLM8JSPYK1atP20NcomOmEc1MyLJefPa8tmZe92tkgi9ZbAJBXrQ7Ufm5mb3XOvehNbb7kbS9LWhB43FnetrJOTpX627/bguNM7daH97f7EDraK2Pj2njFBYkvuEkDqaBGRliigoGwtWLt7LfZi70+ezVABdAbWh2oPSTpBkmbvK/fDGz/d2b2dVUSB17xgrltkr4QSCC4VNL6Fh9zIi8n6EWJaGf2lxq64IYFUkGNjrBkGQxQ6yx7vRigAugNTQvUzOxeVUbDfs3MfqpK9uYmSfeZ2cckPS/pw97DH5F0maSnJR2V9FFJcs4dMbPPSfqB97jP+okF6B7BIKreC67/nI0P7Z/MGjWTnKusMcsiGMoiGKin/ycAoHc1M+vz2oi73hvyWCfpkxH7+Yqkr2R4aE3RXypOKyvRK1YtmqfnfjGmF7zSFWkUzHT7VUsq+9m0veFRpmPHT0x+79zJIDAvQVBcKYm8HCMAID/oTJCRjVdcoGJfb2Z93vPxd2vHukv07KbLI7sKRPFLWVQXLL1py15tGBpJta9OqKdFKQkAQBoEahkZXDagzddcqFKxt05pwWxKUdl6Smfc+vD+aQGWk3TPzoOpCtV2QhBEKQkAQBq9FVU0kb9AfGz8RO0Hd5EJ5yZHwW7cslcbH9qvqy9KN4UXlYjhpFSjYZ0QBPVqrTMAQH0I1DJAQ/aTRsfG9cCess5488xM9pdmNKwTgqCk7aAAAJAkcxG9CTvZ8uXL3e7du1v2eklqeKE+/aWi5syakTjJgNIXAIBOY2Z7nHPLw+5rW2eCbrBhaET37joU2Ygbyc0u9mls/MSUrNFin+m1N45PZtMmKWVBPS0AQDdh6rNOG4ZGdPfOgwRpGSgVC/rCVe/QHWuWTpkSfNMpM6a15cpbFicAAM3EiFqd7t11qPaDelSpWIjsEBAmuEYrOBp27rqtoY/PUxYnAADNxIhanRhJm6q/VJz8/pSUJUqipio7IYsTAIBmIlCrU8F6s7htGFOlqbovq76nnZDFCQBAMxGo1enaFQvafQi54bx/9QiOxFWjlAUAoNexRq1Otw1W+lPes/Ng3UFKryv2mTZecUHsY6KyOIMZtwUzXbtiweRn0myUAAEAtAqBWgNuG1yix548TA21Om2+5sK6Ahw/49Y34dzk7TTBWj0Bl1/c2E+WSFIyBACAejH12aBeDtIaaULfyBq/qIzbNJm4wW4Sfgus9Q+O1Owt2gmN3wEA3YNArQFpGoZ3pQbyKSacSxQYRT03zfYw9QZcndD4HQDQPQjUGrD+wSfafQhtVV2MNq2x8Ql96r59qYO1qNG4NKN09QZclAwBALQSgVqdrrvrcY2Nn2j3YXS8ekbWojJu02Ti1htwUTIEANBKBGp1GBoua8czR9p9GF0j7Rqv2waX6PqVCydH0Apmun7lwlSJBPUGXJQMAQC0krkurLC/fPlyt3v37qbt/9fXbRVjadkzqaXlLiizAQDIAzPb45xbHnYf5TnqQJDWHH725dr790lqfrmLqBptAADkBYFaSj2f6dkC4xNOtz68P3UQxQgZAKDbEKildNOWve0+hJ6Qtl8ohWgBAN2IZIKUum9FX3egEC0AoBsRqCGX4pq1h6EQLQCgGxGoIXeSNGuvRiFaAEA3IlBL6dRZhdoPQl38umT1NGunEC0AoBuRTJDSm0sz9eoxptOq9Zl0IsECPjMprHTfQH9JO9ZdUvfr+4EdWZ8AgG5CoJYSa57COSfduWapNm87oHLcOQoJ0rIa+aIuGgCg2zD1mRJrnsKd2V/S4LIB7Vh3iQZizlF1nDZnZoEWTAAARCBQS+ni8+e3+xByae3qxRoaLmvVpu3xI2pVXh8/QZAGAEAEpj5T+ut9L7b7EHKn2CfdfN/eRGvUqk10Ya9ZAACyQqCW0uhYuor5vWC8geanBbPsDgQAgC7D1Cfa6toVC9p9CAAA5BaBWkpzZ6ermI9oqxbN022DS9p9GAAA5BZTnylNTDQwzwdJlZpp1DgDAKA2ArWUXj02UftBPaTQZ5pImUXQSGFbAAB6CVOfkFRp3xR329dfKmqgvzTZ7ukPr7lQ169cOJkUUDCbcrsayQMAACTHiBokVQrRDvSXJtsvXXz+fD2wp6yx8ZMjiKViQRuvuGDalOXgsoFpa83u3nkw9HUoxwEAQHIEapAU3mtz+dnz6u6dOdBfCi18G9e1AAAATEWgltKqRfO045kj7T6MTBULFtprs5HemWtXL9b6B0emjchl0dMTAIBewRq1lO75+Lu1atG8dh+GJGlmId16L399WPBZc2cXtflDF2aegTm4bEC3X7Vkyno2enoCAJAOI2p1uGb5wqaPqvlTkeeu2zqtkblUCbb+4fOXNfUYGtXIiBwAAGBELbWh4bLWPzjS1NcIThGeGbGmK2o7AADoHgRqKW3edmDKuqt6FPtMc2YWJm+Xin2aO7sYOkW4dvVilYqFKc9nrRcAAL2Bqc+UXgjJZEwjbVV+/3H1Zl8CAIDORaCW0pkRZSeq9ZkULNhfKhbqXkzPWi8AAHoTU58phU1FFgum/tLJqcs71yzVFz+8lIxHAADQEEbUUkozFUlgBgAAGkGgVgemIgEAQCsw9QkAAJBTBGoAAAA5RaAGAACQUwRqAAAAOUWgBgAAkFMEagAAADlFoAYAAJBTBGoAAAA5RaAGAACQUwRqAAAAOUWgBgAAkFMEagAAADlFoAYAAJBTBGoAAAA51TGBmpm938wOmNnTZrau3ccDAADQbB0RqJlZQdL/K+kDkt4u6Voze3t7jwoAAKC5OiJQk/QuSU87537inHtD0tclXdnmYwIAAGiqTgnUBiQdCtz+qbdtkpl9wsx2m9nuw4cPt/TgAAAAmqFTArWanHNfds4td84tnz9/frsPBwAAoGGdEqiVJS0I3D7L2wYAANC1zDnX7mOoycxmSPoHSe9VJUD7gaR/5ZzbH/H4w5KeD7nr1yT9Y7OOE4nxObQfn0E+8Dm0H59BPvT653C2cy50OnBGq4+kHs6542b27yRtk1SQ9JWoIM17fOibNbPdzrnlTTpMJMTn0H58BvnA59B+fAb5wOcQrSMCNUlyzj0i6ZF2HwcAAECrdMoaNQAAgJ7Ta4Hal9t9AJDE55AHfAb5wOfQfnwG+cDnEKEjkgkAAAB6Ua+NqAEAAHQMAjUAAICc6plAzczeb2YHzOxpM1vX7uPpJma2wMweM7O/N7P9Zva73vZ5ZvaomT3lfZ3rbTcz+yPvs3jCzN4Z2NcN3uOfMrMb2vWeOpWZFcxs2Mz+2rt9rpnt8s71FjOb6W2f5d1+2rv/nMA+1nvbD5jZ6ja9lY5lZv1mdr+ZPWlmPzazd/O70HpmdpP39+hHZnavmZ3C70NzmdlXzOwlM/tRYFtmP/tmdpGZjXjP+SMzs9a+wzZxznX9P1Vqrz0j6dclzZS0T9Lb231c3fJP0lslvdP7/s2qFCd+u6T/LGmdt32dpD/wvr9M0t9IMkkrJe3yts+T9BPv61zv+7ntfn+d9E/SzZK+Jumvvdv3SfqI9/2fSPr/ed//n5L+xPv+I5K2eN+/3fv9mCXpXO/3ptDu99VJ/yR9VdLveN/PlNTP70LLP4MBSc9KKnm375P0r/l9aPp5/+eS3inpR4Ftmf3sS/o777HmPfcD7X7PrfjXKyNq75L0tHPuJ865NyR9XdKVbT6mruGce9E590Pv+19K+rEqfyivVOWiJe/roPf9lZL+wlXslNRvZm+VtFrSo865I865lyU9Kun9rXsnnc3MzpJ0uaQ/9W6bpEsk3e89pPoz8D+b+yW913v8lZK+7pw75px7VtLTqvz+IAEzO02Vi9WfSZJz7g3n3Kj4XWiHGZJKVulsM1vSi+L3oamcc9+XdKRqcyY/+959pzrndrpK1PYXgX11tV4J1AYkHQrc/qm3DRnzpgyWSdol6Qzn3IveXT+TdIb3fdTnwefUmDsl/SdJJ7zbb5E06pw77t0Ons/Jc+3d/4r3eD6Dxpwr6bCkP/emoP/UzOaI34WWcs6VJf0XSQdVCdBekbRH/D60Q1Y/+wPe99Xbu16vBGpoATN7k6QHJN3onHs1eJ/3PyBqwTSJmf2mpJecc3vafSw9boYqUz9fcs4tk/SaKtM9k/hdaD5vHdSVqgTOZ0qaI0Yk246f/fr0SqBWlrQgcPssbxsyYmZFVYK0e5xzD3qbf+4NV8v7+pK3Perz4HOq3ypJV5jZc6pM7V8i6b+qMp3gt4oLns/Jc+3df5qkX4jPoFE/lfRT59wu7/b9qgRu/C601r+Q9Kxz7rBzblzSg6r8jvD70HpZ/eyXve+rt3e9XgnUfiDpPC/jZ6Yqi0UfavMxdQ1vLcefSfqxc+6LgbsekuRn7Nwg6ZuB7b/tZf2slPSKNzS+TdKlZjbX+x/xpd421OCcW++cO8s5d44qP9/bnXPXSXpM0oe8h1V/Bv5n8yHv8c7b/hEvC+5cSeepsoAXCTjnfibpkJkt9ja9V9Lfi9+FVjsoaaWZzfb+PvmfA78PrZfJz75336tmttL7TH87sK/u1u5shlb9UyXD5B9Uydr5dLuPp5v+SfpnqgxnPyFpr/fvMlXWeHxH0lOS/oeked7jTdL/630WI5KWB/b1f6iyYPdpSR9t93vrxH+S3qOTWZ+/rsqF5WlJ35A0y9t+inf7ae/+Xw88/9PeZ3NAPZJVlfH5Xyppt/f7MKRK5hq/C63/HG6V9KSkH0n6S1UyN/l9aO45v1eVNYHjqowufyzLn31Jy73P8xlJ/4+87krd/o8WUgAAADnVK1OfAAAAHYdADQAAIKcI1AAAAHKKQA0AACCnCNQAAAByikANAEKY2SNm1h+yfaOZ/Ufv+39tZmcG7nvOzH6thYcJoMsRqAFACOfcZa7SUD3Ov1alRREANAWBGoCeZGZrzew/eN/fYWbbve8vMbN7gqNjZvZpM/sHM/tbSYu9bR9SpQDnPWa218xK3q7/vZn90MxGzOz81r8zAN2EQA1Ar/qfkn7D+365pDd5PWt/Q9L3/QeZ2UWqtOVaqkrHjX8qSc65+1XpQHCdc26pc27Me8o/OufeKelLkv5jC94HgC5GoAagV+2RdJGZnSrpmKTHVQnYfkOVIM73G5L+yjl31Dn3qmr3CX4wsP9zMj1iAD1nRrsPAADawTk3bmbPqrLO7H+p0pvzYklvk/TjBnZ9zPs6If7GAmgQI2oAetn/VGV68vve9/9W0rCb2gT5+5IGzaxkZm+W9MHAfb+U9OZWHSyA3kOgBqCX/U9Jb5X0uHPu55Je19RpTznnfihpi6R9kv5G0g8Cd/93SX9SlUwAAJmxqf9xBAAAQF4wogYAAJBTBGoAAAA5RaAGAACQUwRqAAAAOUWgBgAAkFMEagAAADlFoAYAAJBT/3+FZGB+VqFOBQAAAABJRU5ErkJggg==\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 |
--------------------------------------------------------------------------------